Front-end/JS

μžλ°”μŠ€ν¬λ¦½νŠΈ μ •κ·œν‘œν˜„μ‹ RegExp

ciocio 2021. 9. 27. 11:12

πŸ“Œ  μ •κ·œ ν‘œν˜„μ‹ ?

 

μΌμ •ν•œ νŒ¨ν„΄μ„ 가진 λ¬Έμžμ—΄μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν˜•μ‹ μ–Έμ–΄formal language이닀.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 고유 문법은 μ•„λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° 언어와 μ½”λ“œ 에디터에 λ‚΄μž₯λ˜μ–΄ μžˆλ‹€.

μ •κ·œν‘œν˜„μ‹μ€ λ¬Έμžμ—΄μ„ λŒ€μƒμœΌλ‘œ νŒ¨ν„΄ 맀칭 κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— λ°˜λ³΅λ¬Έμ΄λ‚˜ 쑰건문을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ κ°„λ‹¨νžˆ 체크할 수 μžˆλ‹€.

λ‹€λ§Œ, μ—¬λŸ¬κ°€μ§€ 기호λ₯Ό ν˜Όν•©ν•˜μ—¬ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 가독성이 쒋지 μ•Šλ‹€. ^!^

 

 

πŸ“Œ  μ •κ·œ ν‘œν˜„μ‹ 생성

 

β—Ύ  μ •κ·œ ν‘œν˜„μ‹ λ¦¬ν„°λŸ΄

 

μ •κ·œ ν‘œν˜„μ‹ λ¦¬ν„°λŸ΄

 

const target = 'Is this all there is?';

// νŒ¨ν„΄: is
// ν”Œλž˜κ·Έ: i => λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  κ²€μƒ‰ν•œλ‹€.
const regexp = /is/i;

// test λ©”μ„œλ“œ
// target λ¬Έμžμ—΄μ— λŒ€ν•΄ μ •κ·œ ν‘œν˜„μ‹μ˜ νŒ¨ν„΄μ„ κ²€μƒ‰ν•˜μ—¬ 맀칭 κ²°κ³Όλ₯Ό booleanκ°’μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
regexp.test(target);  // true

 

 

β—Ύ  RegExp μƒμ„±μž ν•¨μˆ˜

 

 

μ •κ·œ ν‘œν˜„μ‹ μƒμ„±μž ν•¨μˆ˜

 

const target = 'Is this all there is?';

const regexp = new RegExp(/is/i);
// const regexp = new RegExp(/is/, 'i');
// const regexp = new RegExp('is', 'i');

regexp.test(target);  // true

 

 

πŸ“Œ  ν”Œλž˜κ·Έ flag

 

ν”Œλž˜κ·Έ 의미 μ„€λͺ…
i Ignore case λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•Šκ³  νŒ¨ν„΄μ„ κ²€μƒ‰ν•œλ‹€
g Global νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄μ„ β—μ „μ—­μ β—μœΌλ‘œ κ²€μƒ‰ν•œλ‹€.
m Multi line λ¬Έμžμ—΄μ˜ 행이 λ°”λ€Œλ”λΌλ„ νŒ¨ν„΄ 검색을 κ³„μ†ν•œλ‹€.
s Dotall .이 κ°œν–‰λ¬Έμž \n 도 ν¬ν•¨ν•˜μ—¬ κ²€μƒ‰ν•˜κ²Œλ” ν•œλ‹€. (μ›λž˜λŠ” \n 검색 μ•ˆλ¨)
u Unicode μœ λ‹ˆμ½”λ“œ κ΄€λ ¨ κΈ°λŠ₯을 ν™œμ„±ν™”μ‹œμΌœ κ²€μƒ‰ν•œλ‹€.
y stickY λ¬Έμžμ—΄ λ‚΄ νŠΉμ • μœ„μΉ˜μ—μ„œ 검색을 μ§„ν–‰ν•œλ‹€. (feat. regexp.lastIndex)

 

 

πŸ“Œ  νŒ¨ν„΄ pattern

 

β—Ύ  λ¬Έμžμ—΄ 검색

 

const target = 'Is this all there is?';

const regExp = /is/;

regExp.test(target);
// targetκ³Ό μ •κ·œ ν‘œν˜„μ‹μ΄ λ§€μΉ˜ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•œλ‹€.
// true

target.match(regExp);
// targetκ³Ό μ •κ·œ ν‘œν˜„μ‹μ˜ 맀칭 κ²°κ³Όλ₯Ό κ΅¬ν•œλ‹€.
// ['is', index: 5, input: 'Is this all there is?', groups: undefined]
const target = 'Is this all there is?';

const regExp = /is/i;

target.match(regExp);
// ['Is', index: 0, input: 'Is this all there is?', groups: undefined]
const target = 'Is this all there is?';

const regExp = /is/ig;

target.match(regExp);
// ['Is', 'is', 'is']

 

 

β—Ύ  μž„μ˜μ˜ λ¬Έμžμ—΄ 검색

 

βœ”  ...

 

const target = 'Is this all there is?';

const regExp = /.../g;
// .이 3개 -> μž„μ˜μ˜ 3자리 λ¬Έμžμ—΄μ„ (λŒ€μ†Œλ¬Έμž κ΅¬λ³„ν•˜μ—¬) μ „μ—­ κ²€μƒ‰ν•œλ‹€.

target.match(regExp);
// ['Is ', 'thi', 's a', 'll ', 'the', 're ', 'is?']

 

 

β—Ύ  반볡 검색

 

βœ”  {n}

 

const target = 'A AA B BB Aa Bb AAA';

const regExp = /A{1,2}/g;
// 'A'κ°€ μ΅œμ†Œ 1번 && μ΅œλŒ€ 2번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// {n}은 μ•žμ„  νŒ¨ν„΄μ΄ n번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€. {n} === {n,n}

target.match(regExp);
// ['A', 'AA', 'A', 'AA', 'A']
const target = 'A AA B BB Aa Bb AAA';

const regExp = /A{2}/g;
// 'A'κ°€ 2번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.

target.match(regExp);
// ['AA', 'AA']
const target = 'A AA B BB Aa Bb AAA';

const regExp = /A{2,}/g;
// 'A'κ°€ 2번 "이상" λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// {n,}은 μ•žμ„  νŒ¨ν„΄μ΄ μ΅œμ†Œ n번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€.

target.match(regExp);
// ['AA', 'AAA']

 

βœ”  +

 

const target = 'A AA B BB Aa Bb AAA';

const regExp = /A+/g;
// 'A'κ°€ μ΅œμ†Œ 1번 이상 λ°˜μ‘±λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// +λŠ” μ•žμ„  νŒ¨ν„΄μ΄ μ΅œμ†Œ ν•œλ²ˆ 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€. + === {1,}

target.match(regExp);
// ['A', 'AA', 'A', 'AAA']

 

βœ”  ?

 

const target = 'color colour colouuuuur';

const regExp = /colou?r/g;
// 'colo' λ‹€μŒ 'u'κ°€ μ΅œλŒ€ 1번 이상(0번 or 1번) 반볡되고 'r'이 μ΄μ–΄μ§€λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// ?λŠ” μ•žμ„  νŒ¨ν„΄μ΄ μ΅œλŒ€ 1번(0번 포함) 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€.

target.match(regExp);
// ['color', 'colour']

 

 

β—Ύ  OR 검색

 

βœ”  |

 

const target = 'A AA B BB Aa Bb';

const regExp = /A|B/g;
// 'A' λ˜λŠ” 'B'λ₯Ό μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// |λŠ” or의 의미λ₯Ό 가진닀.

target.match(regExp);
// ['A', 'A', 'A', 'B', 'B', 'B', 'A', 'B']
const target = 'A AA B BB Aa Bb';

const regExp = /A+|B+/g;
// 'A' λ˜λŠ” 'B'κ°€ 1번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// λΆ„ν•΄λ˜μ§€ μ•Šμ€ 단어 레벨둜 κ²€μƒ‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” +λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•œλ‹€.

target.match(regExp);
// ['A', 'AA', 'B', 'BB', 'A', 'B']

 

βœ”  [ ]

 

const target = 'A AA B BB Aa Bb';

const regExp = /[AB]+/g;
// 'A' λ˜λŠ” 'B'κ°€ 1번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// [] λ‚΄μ˜ λ¬ΈμžλŠ” or둜 λ™μž‘ν•œλ‹€. 뒀에 +λ₯Ό λ”ν•˜λ©΄ μ•žμ„  νŒ¨ν„΄μ„ ν•œλ²ˆ 이상 λ°˜λ³΅ν•œλ‹€.

target.match(regExp);
// ['A', 'AA', 'B', 'BB', 'A', 'B']
const target = 'A AA BB ZZ Aa Bb';

const regExp = /[A-Z]+/g;
// 'A' ~ 'Z'κ°€ 1번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.

target.match(regExp);
λ°˜μ‘ν˜•