JavaScript

JavaScript μ •κ·œ ν‘œν˜„μ‹(Regular Expression)

kohi β˜• 2022. 10. 16. 22:27

πŸ” μ •κ·œ ν‘œν˜„μ‹(Regular Expression)


  • μ •κ·œμ‹μ€ λ¬Έμžμ—΄μ—μ„œ νŠΉμ • λ‚΄μš©μ„ μ°Ύκ±°λ‚˜ λŒ€μ²΄, λ˜λŠ” λ°œμ·Œν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
  • 예λ₯Ό λ“€μ–΄ νšŒμ›κ°€μž… ν™”λ©΄μ—μ„œ μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯ λ°›λŠ” μ „ν™”λ²ˆν˜Έκ°€ μœ νš¨ν•œμ§€ 체크할 ν•„μš”κ°€ μžˆλ‹€. μ΄λ•Œ μ •κ·œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ κ°„λ‹¨νžˆ μ²˜λ¦¬ν•  수 μžˆλ‹€.
  • 반볡문과 쑰건문을 μ‚¬μš©ν•œ λ³΅μž‘ν•œ μ½”λ“œλ„ μ •κ·œ ν‘œν˜„μ‹μ„ μ΄μš©ν•˜λ©΄ 맀우 κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€.
  • κ·ΈλŸ¬λ‚˜ μ •κ·œ ν‘œν˜„μ‹μ€ μ£Όμ„μ΄λ‚˜ 곡백을 ν—ˆμš©ν•˜μ§€ μ•Šκ³ , μ—¬λŸ¬κ°€μ§€ 기호λ₯Ό ν˜Όν•©ν•˜μ—¬ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 가독성이 쒋지 μ•Šλ‹€λŠ” λ¬Έμ œκ°€ μžˆλ‹€.
  • μ •κ·œ ν‘œν˜„μ‹μ€ λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μœΌλ‘œ 생성할 수 μžˆλ‹€. μ •κ·œ ν‘œν˜„μ‹ λ¦¬ν„°λŸ΄μ€ μ•„λž˜μ™€ 같이 ν‘œν˜„ν•œλ‹€.

 

 

πŸ” μ •κ·œ ν‘œν˜„μ‹ ν™œμš© μ˜ˆμ‹œ


πŸ’‘ 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!

 

  • /였/: ‘였’λ₯Ό ν•˜λ‚˜λ§Œ μ°ΎλŠ”λ‹€.
    • 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!
  • /였/g: ‘였’λ₯Ό λͺ¨λ‘ μ°ΎλŠ”λ‹€.
    • 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!
    • g(global) ν”Œλž˜κ·Έλ₯Ό 뒀에 λΆ™μ˜€λ‹€.
  • /μ˜€μ§•μ–΄ 땅콩/: ‘μ˜€μ§•μ–΄ 땅콩’을 μ°ΎλŠ”λ‹€.
    • 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!
  • /[였m1]/g: ‘였’, ‘m’, ‘1’을 λͺ¨λ‘ μ°ΎλŠ”λ‹€.
    • 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!
  • /[0-9]/g: 숫자 0-9λ₯Ό λͺ¨λ‘ μ°ΎλŠ”λ‹€.
    • 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!
  • /[^0-9]/g: 숫자 0-9κ°€ μ•„λ‹Œ 것을 λͺ¨λ‘ μ°ΎλŠ”λ‹€.
    • 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g **** 16개*** 32***,600원. 였직 mittmallμ—μ„œλ§Œ!***
    • λŒ€κ΄„ν˜Έ [] μ•ˆμ—μ„œ μ•žμ— ^λ₯Ό μ“°λ©΄ λΆ€μ •μ˜ κΈ°λŠ₯을 ν•œλ‹€.
  • [a-zA-Z]g: μ˜μ–΄ μ•ŒνŒŒλ²³ λŒ€λ¬Έμž, μ†Œλ¬Έμžλ₯Ό λͺ¨λ‘ μ°ΎλŠ”λ‹€.
    • 였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!

 

πŸ” μ •κ·œ ν‘œν˜„μ‹ 생성


μƒμ„±μž ν•¨μˆ˜ 방식

RegExp μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

// ν‘œν˜„μ‹
const regexp = new RegExp("^abc");

// ν‘œν˜„μ‹, ν”Œλž˜κ·Έ
const regexp2 = new RegExp("^abc", "gi");

 

λ¦¬ν„°λŸ΄ 방식

/둜 감싸진 νŒ¨ν„΄μ„ λ¦¬ν„°λŸ΄λ‘œ μ‚¬μš©ν•œλ‹€. λ³΄ν†΅μ˜ 경우 λ¦¬ν„°λŸ΄ 방식이 νŽΈλ¦¬ν•˜λ‹€.

// ν‘œν˜„μ‹
const regexp = /^abc/;

// ν‘œν˜„μ‹, ν”Œλž˜κ·Έ
const regexp2 = /^abc/gi;

 

πŸ” μ •κ·œ ν‘œν˜„μ‹ ν˜•μ‹


πŸ’‘ /νŒ¨ν„΄/ν”Œλž˜κ·Έ

  • μŠ¬λž˜μ‹œ / μ‚¬μ΄μ—λŠ” λ§€μΉ­μ‹œν‚¬ νŒ¨ν„΄μ„ 써 μ€€λ‹€.
  • μŠ¬λž˜μ‹œ / λ‹€μŒμ—λŠ” μ˜΅μ…˜μ„ μ„€μ •ν•˜λŠ” ν”Œλž˜κ·Έλ₯Ό 써 μ€€λ‹€. ν”Œλž˜κ·ΈλŠ” μ˜΅μ…˜μ΄λ―€λ‘œ μ„ νƒμ μœΌλ‘œ μ‚¬μš©ν•œλ‹€. ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 경우 λ¬Έμžμ—΄ λ‚΄ 검색 맀칭 λŒ€μƒμ΄ 1개 이상이더라도 첫 번째 λ§€μΉ­ν•œ λŒ€μƒλ§Œμ„ κ²€μƒ‰ν•˜κ³  μ’…λ£Œν•œλ‹€.

 

ν”Œλž˜κ·Έ

  • i (Ignore Case): λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•Šκ³  κ²€μƒ‰ν•œλ‹€.
  • g (Global): λ¬Έμžμ—΄ λ‚΄μ˜ λͺ¨λ“  νŒ¨ν„΄μ„ κ²€μƒ‰ν•œλ‹€.
  • m (Multi Line): λ¬Έμžμ—΄μ˜ 행이 λ°”λ€Œλ”λΌλ„ 검색을 계속 ν•œλ‹€.

 

맀칭 νŒ¨ν„΄(문자, 숫자, 기호 λ“±)

  • a-zA-Z: μ˜μ–΄ μ•ŒνŒŒλ²³μœΌλ‘œ λ²”μœ„ 지정
  • γ„±-γ…Žκ°€-힣: ν•œκΈ€ 문자둜 λ²”μœ„ 지정
  • 0-9: 숫자둜 λ²”μœ„ 지정
  • .: λͺ¨λ“  λ¬Έμžμ—΄
  • \d: 숫자
  • \D: μˆ«μžκ°€ μ•„λ‹Œ 것
  • \w: μ˜μ–΄ μ•ŒνŒŒλ²³, 숫자, 언더 μŠ€μ½”μ–΄(_)
  • \W: \wκ°€ μ•„λ‹Œ 것
  • \s: space
  • \S: spaceκ°€ μ•„λ‹Œ 것

 

검색 νŒ¨ν„΄

μ•„λž˜ νŒ¨ν„΄μ„ μ΄μš©ν•˜λ©΄ AND, OR, StartWith, EndWith λ“± λ‹€μ–‘ν•œ 쑰합을 λ§Œλ“€ 수 μžˆλ‹€.

  • |: OR
  • []: κ΄„ν˜Έ μ•ˆ λ¬Έμžλ“€ 쀑 ν•˜λ‚˜
  • [^문자]: κ΄„ν˜Έ μ•ˆμ˜ 문자λ₯Ό μ œμ™Έν•œ 것
  • ^λ¬Έμžμ—΄: νŠΉμ • λ¬Έμžμ—΄λ‘œ μ‹œμž‘
  • λ¬Έμžμ—΄$: νŠΉμ • λ¬Έμžμ—΄λ‘œ 끝남
  • (): κ·Έλ£Ή 검색 및 λΆ„λ₯˜
  • (?: νŒ¨ν„΄): κ·Έλ£Ή 검색 (λΆ„λ₯˜ X)
  • \b: λ‹¨μ–΄μ˜ 처음/끝
  • \B: λ‹¨μ–΄μ˜ 처음/끝이 μ•„λ‹˜

 

μˆ˜λŸ‰ νŒ¨ν„΄

νŠΉμ • νŒ¨ν„΄μ΄ λͺ‡ 번 λ°˜λ³΅λ˜λŠ”μ§€ 필터링 κ°€λŠ₯

  • ?: μ΅œλŒ€ ν•œ 번 (μ—†κ±°λ‚˜ ν•œ 번)
  • *: μ—†κ±°λ‚˜ 있음
  • +: μ΅œμ†Œ ν•œ 개
  • {n}: n개
  • {Min,}: μ΅œμ†Œ Min개 이상
  • {Min, Max}: μ΅œμ†Œ Min개 이상, μ΅œλŒ€ Max개 μ΄ν•˜

 

πŸ” μ •κ·œ ν‘œν˜„μ‹ μ£Όμš” λ©”μ„œλ“œ


(“λ¬Έμžμ—΄”).match(/μ •κ·œν‘œν˜„μ‹/ν”Œλž˜κ·Έ)

λ¬Έμžμ—΄μ—μ„œ μ •κ·œ ν‘œν˜„μ‹μ— λ§€μΉ­λ˜λŠ” ν•­λͺ©λ“€μ„ λ°°μ—΄λ‘œ λ°˜ν™˜

const str = "였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!";

console.log(str.match(/[a-zA-Z]/g));

/* [
  'g', 'm', 'i',
  't', 't', 'm',
  'a', 'l', 'l'
] */

 

(”λ¬Έμžμ—΄”).replace(/μ •κ·œν‘œν˜„μ‹/,”λŒ€μ²΄λ¬Έμžμ—΄”)

μ •κ·œ ν‘œν˜„μ‹μ— λ§€μΉ­λ˜λŠ” ν•­λͺ©μ„ λŒ€μ²΄ λ¬Έμžμ—΄λ‘œ λ³€ν™˜

const str = "였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!";

console.log(str.replace(/μ˜€μ§•μ–΄ 땅콩/, "꼬뢁칩"));
// 였늘만 νŠΉκ°€, 꼬뢁칩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!

 

(”λ¬Έμžμ—΄”).split(μ •κ·œν‘œν˜„μ‹)

λ¬Έμžμ—΄μ„ μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ λ§€μΉ­λ˜λŠ” ν•­λͺ©μœΌλ‘œ μͺΌκ°œμ–΄ λ°°μ—΄λ‘œ λ°˜ν™˜

const str = "였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!";

console.log(str.split(/\\s/g));

/* [
  '였늘만',
  'νŠΉκ°€,',
  'μ˜€μ§•μ–΄',
  '땅콩',
  '180g',
  '*',
  '16개',
  '32,600원.',
  '였직',
  'mittmallμ—μ„œλ§Œ!'
] */

 

(μ •κ·œν‘œν˜„μ‹).test(”λ¬Έμžμ—΄”)

λ¬Έμžμ—΄μ΄ μ •κ·œ ν‘œν˜„μ‹κ³Ό 맀칭되면 true, μ•„λ‹ˆλ©΄ false λ°˜ν™˜

const str = "였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!";

console.log(/^μ–΄μ œ/.test(str)); // false

 

(μ •κ·œν‘œν˜„μ‹).exec(”λ¬Έμžμ—΄”)

match λ©”μ„œλ“œμ™€ μœ μ‚¬ (단, 무쑰건 첫 번째 맀칭 결과만 λ°˜ν™˜)

const str = "였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!";

console.log(/[a-zA-Z]/.exec(str));

/* [
  'g',
  index: 18,
  input: '였늘만 νŠΉκ°€, μ˜€μ§•μ–΄ 땅콩 180g * 16개 32,600원. 였직 mittmallμ—μ„œλ§Œ!',
  groups: undefined
] */

 

πŸ” μ •κ·œ ν‘œν˜„μ‹ ν™œμš© μ½”λ“œ


  • μ›Ήμ‚¬μ΄νŠΈ μ£Όμ†Œ μ •κ·œ ν‘œν˜„μ‹
    • http:// ν˜Ήμ€ https://둜 μ‹œμž‘ν•˜κ³  μ•ŒνŒŒλ²³, μ–Έλ”μŠ€μ½”μ–΄, ν•˜μ΄ν”ˆ, dot으둜 이루어져 μžˆλ‹€.
    const str = "κ°œμ€€μƒ mitt의 ν‹°μŠ€ν† λ¦¬: <https://trustmitt.tistory.com>";
    
    console.log(str.match(/https?:\\/\\/[\\w\\-\\.]+/g));
    // [ '<https://trustmitt.tistory.com>' ]
    
    • /https?:\/\/[\w\-\.]+/g
      • http ⇒ 둜 μ‹œμž‘
      • s? ⇒ λ‹€μŒ sλŠ” μžˆκ±°λ‚˜ μ—†λ‹€.
      • : ⇒ λ‹€μŒμœΌλ‘œ :
      • \/\/ ⇒ λ‹€μŒμœΌλ‘œ 특수기호 //
      • [\w\-\.]+ ⇒ 영문자, μ–Έλ”μŠ€μ½”μ–΄, ν•˜μ΄ν”ˆ, dot으둜 이루어진 λ¬Έμžμ—΄μ΄ ν•œ 개 이상 μžˆλ‹€.
      • ν”Œλž˜κ·Έ g ⇒ λ§€μΉ­λ˜λŠ” κ±Έ λͺ¨λ‘ λ°˜ν™˜

 

  • μ „ν™”λ²ˆν˜Έ μ •κ·œ ν‘œν˜„μ‹
    • μœ μ„  λ²ˆν˜ΈλŠ” 02-111-1111, ν•Έλ“œν°μ€ 010-1111-1111 ν˜•μ‹μ΄λ‹€. 숫자의 κ°œμˆ˜κ°€ λ‹€λ₯΄λ‹€.
    const str = "μ˜€μ§•μ–΄ 땅콩 κ΅¬μž… 문의: 010-1111-1111 neartheclouds@naver.com";
    
    console.log(str.match(/\\d{2,3}-\\d{3,4}-\\d{4}/g));
    // [ '010-1111-1111' ]
    
    • /\d{2,3}-\d{3,4}-\d{4}/g
      • \d{2,3} ⇒ 숫자 2-3개둜 μ‹œμž‘
      • \- ⇒ λ‹€μŒ ν•˜μ΄ν”ˆ
      • \d{3,4} ⇒ λ‹€μŒ 숫자 3-4개
      • \- ⇒ λ‹€μŒ ν•˜μ΄ν”ˆ
      • \d{3,4} ⇒ λ‹€μŒ 숫자 3-4개
      • ν”Œλž˜κ·Έ g ⇒ λ§€μΉ­λ˜λŠ” κ±Έ λͺ¨λ‘ λ°˜ν™˜

 

  • 이메일 μ£Όμ†Œ μ •κ·œ ν‘œν˜„μ‹
    const str = "μ˜€μ§•μ–΄ 땅콩 κ΅¬μž… 문의: 010-1111-1111 neartheclouds@naver.com";
    
    console.log(str.match(/[\\w\\-\\.]+\\@[\\w\\-\\.]+/g));
    // [ 'neartheclouds@naver.com' ]
    

 

  • μ•„μ΄λ””λ‘œ μ‚¬μš© κ°€λŠ₯ν•œμ§€ 검사
    • 영문자, 숫자만 ν—ˆμš©, 4~10 자리
    const id = "mainmirror";
    
    console.log(/^[A-Za-z0-9]{4,10}$/.test(id)); // true
    

 

  • 특수문자 포함 μ—¬λΆ€ 검사
    const str = "m@ainmirror";
    
    // case 1
    console.log(/[^A-Za-z0-9]/gi.test(str)); // true
    
    // case 2
    regexr = /[\\{\\}\\[\\]\\/?.,;:|\\)*~`!^\\-_+<>@\\#$%&\\\\\\=\\(\\'\\"]/gi;
    console.log(regexr.test(str)); // true
    
    // 특수문자 제거
    console.log(str.replace(regexr, "")); // mainmirror
    

 

πŸ” Reference


https://poiemaweb.com/js-regexp

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jeongju02&logNo=221517177533

https://heropy.blog/2018/10/28/regexp/

https://curryyou.tistory.com/234