ν‹°μŠ€ν† λ¦¬ λ·°

μ •κ·œ ν‘œν˜„μ‹μ΄λž€?

μ •κ·œ ν‘œν˜„μ‹(regular expression)은 μΌμ •ν•œ νŒ¨ν„΄μ„ 가진 λ¬Έμžμ—΄μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν˜•μ‹ μ–Έμ–΄(formal language)μž…λ‹ˆλ‹€. μ •κ·œ ν‘œν˜„μ‹μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 고유 문법이 μ•„λ‹ˆλ©°, λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° 언어와 μ½”λ“œ 에디터에 λ‚΄μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

μ •κ·œ ν‘œν˜„μ‹μ€ λ¬Έμžμ—΄μ„ λŒ€μƒμœΌλ‘œ νŒ¨ν„΄ 맀칭 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. νŒ¨ν„΄ 맀칭 κΈ°λŠ₯μ΄λž€, νŠΉμ • νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄μ„ κ²€μƒ‰ν•˜κ±°λ‚˜ μΆ”μΆœ λ˜λŠ” μΉ˜ν™˜ν•  수 μžˆλŠ” κΈ°λŠ₯을 λ§ν•©λ‹ˆλ‹€.

 

*μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” νŽ„μ˜ μ •κ·œ ν‘œν˜„μ‹ 문법을 ES3λΆ€ν„° λ„μž…

 

예λ₯Ό λ“€μ–΄, νšŒμ›κ°€μž… ν™”λ©΄μ—μ„œ μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯받은 νœ΄λŒ€ν° μ „ν™”λ²ˆν˜Έκ°€ μœ νš¨ν•œ λ²ˆν˜ΈμΈμ§€ "숫자 3개 + '-' + 숫자 4개 + '-' + 숫자 4개" λΌλŠ” μΌμ •ν•œ νŒ¨ν„΄μ„ μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•˜κ³  μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯받은 λ¬Έμžμ—΄μ΄ ν•΄λ‹Ή νŒ¨ν„΄μ— λ§€μΉ­ν•˜λŠ”μ§€ 체크할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

// μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯받은 νœ΄λŒ€ν° μ „ν™”λ²ˆν˜Έ
const tel = '010-1234-567νŒ”';

// μ •κ·œ ν‘œν˜„μ‹ λ¦¬ν„°λŸ΄λ‘œ νœ΄λŒ€ν° μ „ν™”λ²ˆν˜Έ νŒ¨ν„΄μ„ μ •μ˜ν•œλ‹€.
const regExp = /^\d{3}-\d{4}-\d{4}$/;

// tel이 νœ΄λŒ€ν° μ „ν™”λ²ˆν˜Έ νŒ¨ν„΄μ— λ§€μΉ­ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ(확인)ν•œλ‹€.
regExp.test(tel); // -> false

 

이처럼 μ •κ·œν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ μ•„λž˜μ™€ 같은 μž₯단점이 μžˆμŠ΅λ‹ˆλ‹€.

  • μž₯점 : 반볡문과 쑰건문 없이 νŒ¨ν„΄μ„ μ •μ˜ν•˜κ³  ν…ŒμŠ€νŠΈν•˜λŠ” κ²ƒμœΌλ‘œ κ°„λ‹¨νžˆ 체크
  • 단점 : μ •κ·œν‘œν˜„μ‹μ€ μ£Όμ„μ΄λ‚˜ 곡백을 ν—ˆμš©ν•˜μ§€ μ•Šκ³  μ—¬λŸ¬ 가지 기호λ₯Ό ν˜Όν•©ν•˜μ—¬ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 가독성이 쒋지 μ•ŠμŒ

μ •κ·œ ν‘œν˜„μ‹μ˜ 생성

μ •κ·œ ν‘œν˜„μ‹ 객체(RegExp 객체)λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ •κ·œ ν‘œν˜„μ‹ λ¦¬ν„°λŸ΄κ³Ό RegExp μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

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

μ •κ·œ ν‘œν˜„μ‹ 객체λ₯Ό μƒμ„±ν•˜λŠ” 일반적인 λ°©λ²•μœΌλ‘œ, μ •κ·œ ν‘œν˜„μ‹ λ¦¬ν„°λŸ΄μ€ νŒ¨ν„΄κ³Ό ν”Œλž˜κ·Έλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

 

 

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

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

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

 

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

RegExp μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ RegExp 객체λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

더보기

new RegExp(pattern[, flags])

  • pattern : μ •κ·œ ν‘œν˜„μ‹μ˜ νŒ¨ν„΄
  • flags : μ •κ·œ ν‘œν˜„μ‹μ˜ ν”Œλž˜κ·Έ(g, i, m, u, y)
const target = 'Is this all there is?';

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

regexp.test(target); // -> true

// λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ λ™μ μœΌλ‘œ RegExp객체 생성
const count = (str, char) => (str.match(new RegExp(char, 'gi')) ?? []).length;

count('Is this all there is?', 'is'); // -> 3
count('Is this all there is?', 'xx'); // -> 0
  • RegExp μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ λ™μ μœΌλ‘œ RegExp 객체λ₯Ό 생성할 수 있음

RegExp λ©”μ„œλ“œ

μ •κ·œν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œλŠ” RegExp.prototype.exec, RegExp.prototype.test, String.prototype.match, String.prototype.replace, String.prototype.search, String.prototype.split 등이 μžˆμŠ΅λ‹ˆλ‹€.

 

RegExp.prototype.exec

exec λ©”μ„œλ“œλŠ” 인수둜 전달받은 λ¬Έμžμ—΄μ— λŒ€ν•΄ μ •κ·œ ν‘œν˜„μ‹μ˜ νŒ¨ν„΄μ„ κ²€μƒ‰ν•˜μ—¬ 맀칭 κ²°κ³Όλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•˜κ³  맀칭 κ²°κ³Όκ°€ μ—†λŠ” 경우 null을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

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

regExp.exec(target); // -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
  • λ¬Έμžμ—΄ λ‚΄μ˜ λͺ¨λ“  νŒ¨ν„΄μ„ κ²€μƒ‰ν•˜λŠ” gν”Œλž˜κ·Έλ₯Ό 지정해도 첫 번째 맀칭 결과만 λ°˜ν™˜ν•˜λŠ” 것을 μ£Όμ˜ν•΄μ•Ό 함

 

RegExp.prototype.test

test λ©”μ„œλ“œλŠ” 인수둜 전달받은 λ¬Έμžμ—΄μ— λŒ€ν•΄ μ •κ·œ ν‘œν˜„μ‹μ˜ νŒ¨ν„΄μ„ κ²€μƒ‰ν•˜μ—¬ 맀칭 κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

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

regExp.test(target); // -> true

 

String.prototype.match

String ν‘œμ€€ 빌트인 객체가 μ œκ³΅ν•˜λŠ” match λ©”μ„œλ“œλŠ” λŒ€μƒ λ¬Έμžμ—΄κ³Ό 인수둜 전달받은 μ •κ·œ ν‘œν˜„μ‹κ³Όμ˜ 맀칭 κ²°κ³Όλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

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

target.match(regExp); // -> ["is", index: 5, input: "Is this all there is?", groups: undefined]

// g ν”Œλž˜κ·Έ 지정
const target = 'Is this all there is?';
const regExp = /is/g;

target.match(regExp); // -> ["is", "is"]
  • test λ©”μ„œλ“œμ™€ 달리 λ¬Έμžμ—΄ λ‚΄μ˜ λͺ¨λ“  νŒ¨ν„΄μ„ κ²€μƒ‰ν•˜λŠ” gν”Œλž˜κ·Έκ°€ μ§€μ •λ˜λ©΄ λͺ¨λ“  맀칭 κ²°κ³Όλ₯Ό λ°˜ν™˜

ν”Œλž˜κ·Έ

νŒ¨ν„΄κ³Ό ν•¨κ»˜ μ •κ·œ ν‘œν˜„μ‹μ„ κ΅¬μ„±ν•˜λŠ” ν”Œλž˜κ·ΈλŠ” μ •κ·œ ν‘œν˜„μ‹μ˜ 검색 방식을 μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ 총 6개의 ν”Œλž˜κ·Έκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. 그쀑 μ€‘μš”ν•œ 3개의 ν”Œλž˜κ·ΈλŠ” i, g, mμž…λ‹ˆλ‹€.

 

ν”Œλž˜κ·Έ 의미 μ„€λͺ…
i Ignore case λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•Šκ³  νŒ¨ν„΄μ„ 검색
g Global λŒ€μƒ λ¬Έμžμ—΄ λ‚΄μ—μ„œ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λͺ¨λ“  λ¬Έμžμ—΄μ„ μ „μ—­ 검색
m Multi line λ¬Έμžμ—΄μ˜ 행이 λ°”λ€Œλ”λΌλ„ νŒ¨ν„΄ 검색을 계속함
s dotAll .이 κ°œν–‰ 문자 \n도 ν¬ν•¨ν•˜λ„λ‘ 'dotall' λͺ¨λ“œλ₯Ό ν™œμ„±ν™”
u Unicode μœ λ‹ˆμ½”λ“œ; νŒ¨ν„΄μ„ μœ λ‹ˆμ½”λ“œ μ½”λ“œ 포인트의 λ‚˜μ—΄λ‘œ μ·¨κΈ‰
y Sticky λŒ€μƒ λ¬Έμžμ—΄μ˜ ν˜„μž¬ μœ„μΉ˜λΆ€ν„° 비ꡐλ₯Ό μ‹œμž‘ν•˜λ„λ‘ μ„€μ •ν•˜λŠ” 'sticky' λͺ¨λ“œλ₯Ό ν™œμ„±ν™”

 

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

// target λ¬Έμžμ—΄μ—μ„œ is λ¬Έμžμ—΄μ„ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ—¬ ν•œ 번만 κ²€μƒ‰ν•œλ‹€.
target.match(/is/);
// -> ["is", index: 5, input: "Is this all there is?", groups: undefined]

// target λ¬Έμžμ—΄μ—μ„œ is λ¬Έμžμ—΄μ„ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•Šκ³  ν•œ 번만 κ²€μƒ‰ν•œλ‹€.
target.match(/is/i);
// -> ["Is", index: 0, input: "Is this all there is?", groups: undefined]

// target λ¬Έμžμ—΄μ—μ„œ is λ¬Έμžμ—΄μ„ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ—¬ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
target.match(/is/g);
// -> ["is", "is"]

// target λ¬Έμžμ—΄μ—μ„œ is λ¬Έμžμ—΄μ„ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•Šκ³  μ „μ—­ κ²€μƒ‰ν•œλ‹€.
target.match(/is/ig);
// -> ["Is", "is", "is"]
  • ν”Œλž˜κ·ΈλŠ” μ˜΅μ…˜μ΄λ―€λ‘œ μ„ νƒμ μœΌλ‘œ μ‚¬μš©ν•  수 있음
  • μˆœμ„œμ™€ 상관없이 ν•˜λ‚˜ μ΄μƒμ˜ ν”Œλž˜κ·Έλ₯Ό λ™μ‹œμ— μ„€μ •ν•  수 있음
  • ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 경우 λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•΄μ„œ νŒ¨ν„΄μ„ κ²€μƒ‰ν•˜κ³  λ¬Έμžμ—΄μ— νŒ¨ν„΄ 검색 맀칭 λŒ€μƒμ΄ 1개 이상 μ‘΄μž¬ν•΄λ„ 첫 번째 λ§€μΉ­ν•œ λŒ€μƒλ§Œ κ²€μƒ‰ν•˜κ³  μ’…λ£Œ

νŒ¨ν„΄

μ •κ·œ ν‘œν˜„μ‹μ€ νŒ¨ν„΄κ³Ό ν”Œλž˜κ·Έλ‘œ κ΅¬μ„±λ˜λŠ”λ° 이쀑 νŒ¨ν„΄μ€ λ¬Έμžμ—΄μ˜ μΌμ •ν•œ κ·œμΉ™μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

  • νŒ¨ν„΄μ€ /둜 μ—΄κ³  λ‹«μœΌλ©° λ¬Έμžμ—΄μ˜ λ”°μ˜΄ν‘œλŠ” μƒλž΅ (λ”°μ˜΄ν‘œλ₯Ό ν¬ν•¨ν•˜λ©΄ λ”°μ˜΄ν‘œκΉŒμ§€λ„ νŒ¨ν„΄μ— ν¬ν•¨λ˜μ–΄ 검색)
  • νŒ¨ν„΄μ€ νŠΉλ³„ν•œ 의미λ₯Ό κ°€μ§€λŠ” λ©”νƒ€λ¬Έμž λ˜λŠ” 기호둜 ν‘œν˜„ν•  수 있음
  • μ–΄λ–€ λ¬Έμžμ—΄ 내에 νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄μ΄ μ‘΄μž¬ν•  λ•Œ 'μ •κ·œ ν‘œν˜„μ‹κ³Ό λ§€μΉ˜ν•œλ‹€'라고 ν‘œν˜„ν•¨

νŒ¨ν„΄μ„ ν‘œν˜„ν•˜λŠ” λͺ‡ 가지 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

λ¬Έμžμ—΄ 검색

μ •κ·œ ν‘œν˜„μ‹μ˜ νŒ¨ν„΄μ— 문자 λ˜λŠ” λ¬Έμžμ—΄μ„ μ§€μ •ν•˜λ©΄ 검색 λŒ€μƒ λ¬Έμžμ—΄μ—μ„œ νŒ¨ν„΄μœΌλ‘œ μ§€μ •ν•œ 문자 λ˜λŠ” λ¬Έμžμ—΄μ„ κ²€μƒ‰ν•©λ‹ˆλ‹€. RegExp λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 검색 λŒ€μƒ λ¬Έμžμ—΄κ³Ό μ •κ·œ ν‘œν˜„μ‹μ˜ 맀칭 κ²°κ³Όλ₯Ό κ΅¬ν•˜λ©΄ 검색이 μˆ˜ν–‰λ©λ‹ˆλ‹€.

 

// 1. ν”Œλž˜κ·Έλ₯Ό μƒλž΅
const target = 'Is this all there is?';

// 'is' λ¬Έμžμ—΄κ³Ό λ§€μΉ˜ν•˜λŠ” νŒ¨ν„΄. ν”Œλž˜κ·Έκ°€ μƒλž΅λ˜μ—ˆμœΌλ―€λ‘œ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•œλ‹€.
const regExp = /is/;

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

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


// 2. λŒ€μ†Œλ¬Έμž ꡬ별X
const target = 'Is this all there is?';

// 'is' λ¬Έμžμ—΄κ³Ό λ§€μΉ˜ν•˜λŠ” νŒ¨ν„΄. ν”Œλž˜κ·Έ iλ₯Ό μΆ”κ°€ν•˜λ©΄ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•ŠλŠ”λ‹€.
const regExp = /is/i;

target.match(regExp);
// -> ["Is", index: 0, input: "Is this all there is?", groups: undefined]


// 3. μ „μ—­ 검색
const target = 'Is this all there is?';

// 'is' λ¬Έμžμ—΄κ³Ό λ§€μΉ˜ν•˜λŠ” νŒ¨ν„΄.
// ν”Œλž˜κ·Έ gλ₯Ό μΆ”κ°€ν•˜λ©΄ λŒ€μƒ λ¬Έμžμ—΄ λ‚΄μ—μ„œ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λͺ¨λ“  λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
const regExp = /is/ig;

target.match(regExp); // -> ["Is", "is", "is"]
  • ν”Œλž˜κ·Έλ₯Ό μƒλž΅ν•˜λ©΄ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ—¬ μ •κ·œ ν‘œν˜„μ‹κ³Ό λ§€μΉ˜ν•œ 첫 번째 결과만 λ°˜ν™˜
  • ν”Œλž˜κ·Έ iλ₯Ό μ‚¬μš©ν•˜λ©΄ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•Šκ³  검색
  • ν”Œλž˜κ·Έ gλ₯Ό μ‚¬μš©ν•˜λ©΄ νŒ¨ν„΄κ³Ό λ§€μΉ˜ν•˜λŠ” λͺ¨λ“  λ¬Έμžμ—΄μ„ μ „μ—­ 검색

 

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

.은 μž„μ˜μ˜ 문자 ν•œ 개λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λ•Œ 문자의 λ‚΄μš©μ€ 무엇이든 상관이 μ—†μŠ΅λ‹ˆλ‹€.

 

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

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

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

 

반볡 검색

{m,n}은 μ•žμ„  νŒ¨ν„΄μ΄ μ΅œμ†Œ m번, μ΅œλŒ€ n번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•©λ‹ˆλ‹€. 콀마 뒀에 곡백이 있으면 정상 λ™μž‘ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

// 1. {m,n}
const target = 'A AA B BB Aa Bb AAA';

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

target.match(regExp); // -> ["A", "AA", "A", "AA", "A"]


// 2. {n}
const target = 'A AA B BB Aa Bb AAA';

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

target.match(regExp); // -> ["AA", "AA"]


// 3. {n,}
const target = 'A AA B BB Aa Bb AAA';

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

target.match(regExp); // -> ["AA", "AAA"]


// 4. +
const target = 'A AA B BB Aa Bb AAA';

// 'A'κ°€ μ΅œμ†Œ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄('A, 'AA', 'AAA', ...)을 μ „μ—­ κ²€μƒ‰ν•œλ‹€.
const regExp = /A+/g;

target.match(regExp); // -> ["A", "AA", "A", "AAA"]


// 5. ?
const target = 'color colour';

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

target.match(regExp); // -> ["color", "colour"]
  • {m,n}은 μ•žμ„  νŒ¨ν„΄μ΄ μ΅œμ†Œ m번, μ΅œλŒ€ n번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄
  • {n}은 μ•žμ„  νŒ¨ν„΄μ΄ n번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄λ‘œ {n,n}와 κ°™μŒ
  • {n,}은 μ•žμ„  νŒ¨ν„΄μ΄ μ΅œμ†Œ n번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄
  • +λŠ” μ•žμ„  νŒ¨ν„΄μ΄ μ΅œμ†Œ ν•œλ²ˆ 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄λ‘œ {1,}와 κ°™μŒ
  • ?λŠ” μ•žμ„  νŒ¨ν„΄μ΄ μ΅œλŒ€ ν•œλ²ˆ(0번 포함) 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄λ‘œ {0,1}와 κ°™μŒ

 

OR 검색

|은 or의 의미λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 

// 1. /A|B/
const target = 'A AA B BB Aa Bb';

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

target.match(regExp); // -> ["A", "A", "A", "B", "B", "B", "A", "B"]


// 2. λΆ„ν•΄λ˜μ§€ μ•ŠλŠ” 단어 레벨
const target = 'A AA B BB Aa Bb';

// 'A' λ˜λŠ” 'B'κ°€ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// 'A', 'AA', 'AAA', ... λ˜λŠ” 'B', 'BB', 'BBB', ...
const regExp = /A+|B+/g;

target.match(regExp); // -> ["A", "AA", "B", "BB", "A", "B"]


// 3. [] λ‚΄μ˜ λ¬ΈμžλŠ” or둜 λ™μž‘
const target = 'A AA B BB Aa Bb';

// 'A' λ˜λŠ” 'B'κ°€ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
// 'A', 'AA', 'AAA', ... λ˜λŠ” 'B', 'BB', 'BBB', ...
const regExp = /[AB]+/g;

target.match(regExp); // -> ["A", "AA", "B", "BB", "A", "B"]


// 4. []μ•ˆμ— -λ₯Ό 톡해 λ²”μœ„ 지정
const target = 'A AA BB ZZ Aa Bb';

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

target.match(regExp); // -> ["A", "AA", "BB", "ZZ", "A", "B"]


// 5. λŒ€μ†Œλ¬Έμž κ΅¬λ³„ν•˜μ§€ μ•Šκ³  λ²”μœ„ 검색
const target = 'AA BB Aa Bb 12';

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

target.match(regExp); // -> ["AA", "BB", "Aa", "Bb"]


// 6. 숫자λ₯Ό 검색
const target = 'AA BB 12,345';

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

target.match(regExp); // -> ["12", "345"]

const target = 'AA BB 12,345';

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

target.match(regExp); // -> ["12,345"]


// 7. \dλŠ” 숫자λ₯Ό 의미, \DλŠ” μˆ«μžκ°€ μ•„λ‹Œ 문자λ₯Ό 의미
const target = 'AA BB 12,345';

// '0' ~ '9' λ˜λŠ” ','κ°€ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
let regExp = /[\d,]+/g;

target.match(regExp); // -> ["12,345"]

// '0' ~ '9'κ°€ μ•„λ‹Œ 문자(μˆ«μžκ°€ μ•„λ‹Œ 문자) λ˜λŠ” ','κ°€ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
regExp = /[\D,]+/g;

target.match(regExp); // -> ["AA BB ", ","]


// 8. \wλŠ” μ•ŒνŒŒλ²³, 숫자, μ–Έλ”μŠ€μ½”μ–΄λ₯Ό 의미
const target = 'Aa Bb 12,345 _$%&';

// μ•ŒνŒŒλ²³, 숫자, μ–Έλ”μŠ€μ½”μ–΄, ','κ°€ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
let regExp = /[\w,]+/g;

target.match(regExp); // -> ["Aa", "Bb", "12,345", "_"]

// μ•ŒνŒŒλ²³, 숫자, μ–Έλ”μŠ€μ½”μ–΄κ°€ μ•„λ‹Œ 문자 λ˜λŠ” ','κ°€ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
regExp = /[\W,]+/g;

target.match(regExp); // -> [" ", " ", ",", " $%&"]
  • /A|B/λŠ” 'A' λ˜λŠ” 'B'λ₯Ό λΆ„ν•΄λœ 단어 레벨 μƒνƒœλ‘œ 검색
  • +λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•žμ„  νŒ¨ν„΄μ„ ν•œ 번 이상 λ°˜λ³΅ν•˜λŠ” λ¬Έμžμ—΄μ„ κ²€μƒ‰ν•˜κΈ° λ•Œλ¬Έμ— λΆ„ν•΄λ˜μ§€ μ•Šμ€ 단어 레벨둜 검색
  • [] λ‚΄μ˜ λ¬ΈμžλŠ” or둜 λ™μž‘
  • [] 내에 -λ₯Ό μ‚¬μš©ν•˜λ©΄ λ²”μœ„λ₯Ό 지정할 수 있음
  • [\d]λŠ” 숫자λ₯Ό μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ— [0-9]와 κ°™μŒ
  • [\D]λŠ” μˆ«μžκ°€ μ•„λ‹Œ 문자λ₯Ό 의미
  • [\w]λŠ” μ•ŒνŒŒλ²³, 숫자, μ–Έλ”μŠ€μ½”μ–΄λ₯Ό μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ— [A-Za-z0-9_]와 κ°™μŒ
  • [\W]λŠ” μ•ŒνŒŒλ²³, 숫자, μ–Έλ”μŠ€μ½”μ–΄κ°€ μ•„λ‹Œ 문자λ₯Ό 의미

 

NOT 검색

[...] λ‚΄μ˜ ^λŠ” not의 의미λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 

const target = 'AA BB 12 Aa Bb';

// 숫자λ₯Ό μ œμ™Έν•œ λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.
const regExp = /[^0-9]+/g;

target.match(regExp); // -> ["AA BB ", " Aa Bb"]

μ‹œμž‘ μœ„μΉ˜λ‘œ 검색

[...] λ°–μ˜ ^λŠ” λ¬Έμžμ—΄μ˜ μ‹œμž‘μ„ μ˜λ―Έν•©λ‹ˆλ‹€. 단, [...] λ‚΄μ˜ ^λŠ” not의 의미λ₯Ό 가지기 λ•Œλ¬Έμ— μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

const target = 'https://poiemaweb.com';

// 'https'둜 μ‹œμž‘ν•˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
const regExp = /^https/;

regExp.test(target); // -> true

 

λ§ˆμ§€λ§‰ μœ„μΉ˜λ‘œ 검색

$λŠ” λ¬Έμžμ—΄μ˜ λ§ˆμ§€λ§‰μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

 

const target = 'https://poiemaweb.com';

// 'com'으둜 λλ‚˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
const regExp = /com$/;

regExp.test(target); // -> true

자주 μ‚¬μš©ν•˜λŠ” μ •κ·œν‘œν˜„μ‹

νŠΉμ • λ‹¨μ–΄λ‘œ μ‹œμž‘ν•˜λŠ”μ§€ 검사

 

const url = 'https://example.com';

// 'http://' λ˜λŠ” 'https://'둜 μ‹œμž‘ν•˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
/^https?:\/\//.test(url); // -> true

/^(http|https):\/\//.test(url); // -> true
  • [ ... ] λ°”κΉ₯의 ^λŠ” λ¬Έμžμ—΄μ˜ μ‹œμž‘μ„ 의미
  • ?은 μ•žμ„  νŒ¨ν„΄μ΄ μ΅œλŒ€ ν•œ 번(0번 포함) 이상 λ°˜λ³΅λ˜λŠ”μ§€λ₯Ό 의미

 

νŠΉμ • λ‹¨μ–΄λ‘œ λλ‚˜λŠ”μ§€ 검사

 

const fileName = 'index.html';

// 'html'둜 λλ‚˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
  • $λŠ” λ¬Έμžμ—΄μ˜ λ§ˆμ§€λ§‰μ„ 의미

 

숫자둜만 이루어진 λ¬Έμžμ—΄μΈμ§€ 검사

 

const target = '12345';

// 숫자둜만 이루어진 λ¬Έμžμ—΄μΈμ§€ κ²€μ‚¬ν•œλ‹€.
/^\d+$/.test(target); // -> true

 

  • [ ... ] λ°”κΉ₯의 ^은 λ¬Έμžμ—΄μ˜ μ‹œμž‘μ„, $λŠ” λ¬Έμžμ—΄μ˜ λ§ˆμ§€λ§‰μ„ 의미
  • \dλŠ” 숫자λ₯Ό μ˜λ―Έν•˜κ³  +λŠ” μ•žμ„  νŒ¨ν„΄μ΄ μ΅œμ†Œ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ 의미

 

ν•˜λ‚˜ μ΄μƒμ˜ 곡백으둜 μ‹œμž‘ν•˜λŠ”μ§€ 검사

 

const target = ' Hi!';

// ν•˜λ‚˜ μ΄μƒμ˜ 곡백으둜 μ‹œμž‘ν•˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
/^[\s]+/.test(target); // -> true
  • \sλŠ” μ—¬λŸ¬ 가지 곡백 문자(슀페이슀, νƒ­ λ“±)을 μ˜λ―Έν•˜λ©° [\t\r\n\v\f]와 같은 의미

 

μ•„μ΄λ””λ‘œ μ‚¬μš© κ°€λŠ₯ν•œμ§€ 검사

 

const id = 'abc123';

// μ•ŒνŒŒλ²³ λŒ€μ†Œλ¬Έμž λ˜λŠ” 숫자둜 μ‹œμž‘ν•˜κ³  λλ‚˜λ©° 4 ~ 10μžλ¦¬μΈμ§€ κ²€μ‚¬ν•œλ‹€.
/^[A-Za-z0-9]{4,10}$/.test(id); // -> true
  • 검색 λŒ€μƒ λ¬Έμžμ—΄μ΄ μ•ŒνŒŒλ²³ λŒ€μ†Œλ¬Έμž λ˜λŠ” 숫자둜 μ‹œμž‘ν•˜κ³  λλ‚˜λ©° 4~10μžλ¦¬μΈμ§€ 검사

 

메일 μ£Όμ†Œ ν˜•μ‹μ— λ§žλŠ”μ§€ 검사

 

const email = 'ungmo2@gmail.com';

/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/.test(email); // -> true


// 인터넷 λ©”μ‹œμ§€ ν˜•μ‹ κ·œμ•½
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
  • λ§Œμ•½ 인터넷 λ©”μ‹œμ§€ ν˜•μ‹ κ·œμ•½μΈ RFC 5322에 λ§žλŠ” μ •κ΅ν•œ νŒ¨ν„΄ 맀칭이 ν•„μš”ν•˜λ‹€λ©΄ λ³΅μž‘ν•œ νŒ¨ν„΄μ„ μ‚¬μš©ν•΄μ•Όν•¨

 

ν•Έλ“œν° 번호 ν˜•μ‹μ— λ§žλŠ”μ§€ 검사

 

const cellphone = '010-1234-5678';

/^\d{3}-\d{3,4}-\d{4}$/.test(cellphone); // -> true

 

특수 문자 포함 μ—¬λΆ€ 검사

 

// 1. 특수 문자 포함 확인
const target = 'abc#123';

// A-Za-z0-9 μ΄μ™Έμ˜ λ¬Έμžκ°€ μžˆλŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
(/[^A-Za-z0-9]/gi).test(target); // -> true



// 2. 특수 문자λ₯Ό μ„ νƒμ μœΌλ‘œ 검사
(/[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]/gi).test(target); // -> true


// 3. 특수 문자λ₯Ό 제거
target.replace(/[^A-Za-z0-9]/gi, ''); // -> abc123

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr

 

'JavaScript > λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[JavaScript] 7번째 데이터 νƒ€μž… Symbol  (0) 2022.08.05
[JavaScript] String  (0) 2022.08.03
[JavaScript] Date  (0) 2022.08.02
[JavaScript] Math  (0) 2022.08.02
[JavaScript] Number  (0) 2022.08.02