31μž₯ RegExp

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

μ •κ·œ ν‘œν˜„μ‹μ΄λž€ μΌμ •ν•œ νŒ¨ν„΄μ„ κ°€μ§„ λ¬Έμžμ—΄μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν˜•μ‹ 언어이닀.

λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° 언어와 μ½”λ“œ 에디터에 λ‚΄μž₯λ˜μ–΄ 있고, JSμ—λŠ” ES3λΆ€ν„° λ„μž…ν–ˆλ‹€κ³  ν•œλ‹€.

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

예λ₯Ό λ“€μ–΄, νœ΄λŒ€ν° μ „ν™”λ²ˆν˜Έλ₯Ό ν™•μΈν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μž. ν•œκ΅­μ˜ μ „ν™”λ²ˆν˜ΈλŠ” 3개의 숫자 - 4개의 숫자 - 4개의 숫자 둜 이루어져 있고, 이λ₯Ό μ •κ·œ ν‘œν˜„μ‹ 없이 ν™•μΈν•˜λ €λ©΄ λ°˜λ³΅λ¬Έμ΄λ‚˜ 쑰건문을 ν™œμš©ν•΄ ν•œ λ¬Έμžμ”© ν™•μΈν•˜λŠ” 방법을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

μ •κ·œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 νŒ¨ν„΄μ„ μ •μ˜ν•˜κ³  ν…ŒμŠ€νŠΈν•˜λŠ” κ²ƒμœΌλ‘œ 확인할 수 μžˆλ‹€.

const tel = '010-1234-5678'
const regExp = /^\\d{3}-\\d{4}-\\d{4}$/
regExp.test(tel) // true

μ—¬λŸ¬ 기호λ₯Ό ν˜Όν•©ν•˜κΈ°μ— 가독성이 μ’‹μ§€λŠ” μ•Šμ§€λ§Œ, 비ꡐ적 κ°„λ‹¨ν•˜λ‹€λŠ” 점은 λΆ€μ •ν•  수 μ—†λ‹€.


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

μ •κ·œμ‹ λ¦¬ν„°λŸ΄κ³Ό RegExp μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ 생성할 수 μžˆλ‹€.

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

const target = "Is this all there is?"
const regExp = /is/i
regexp.test(target) // true

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

const target = "Is this all there is?"
const regExp = new RegExp(/is/i)
regexp.test(target) // true

// new RegExp(pattern[, flags])

31.3 RegExp λ©”μ„œλ“œ

31.3.1 RegExp.exec

인수둜 전달받은 λ¬Έμžμ—΄μ— λŒ€ν•΄ μ •κ·œ ν‘œν˜„μ‹μ˜ νŒ¨ν„΄μ„ 검색해 λ§€μΉ­ κ²°κ³Όλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€. κ²°κ³Όκ°€ μ—†λŠ” 경우 null을 λ°˜ν™˜ν•œλ‹€. g ν”Œλž˜κ·Έλ₯Ό 지정해도 첫 번째 λ§€μΉ­ 결과만 λ°˜ν™˜ν•œλ‹€.

const target = "Is this all there is?"
const regExp = /is/

regExp.exec(target)
// ['is', index: 5, input: 'Is this all there is?', groups: undefined]

31.3.2 RegExp.test

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

const target = "Is this all there is?"
const regExp = /is/

regExp.test(target) // true

31.3.3 RegExp.match

match λ©”μ„œλ“œλŠ” λŒ€μƒ λ¬Έμžμ—΄κ³Ό 인수둜 전달받은 μ •κ·œ ν‘œν˜„μ‹κ³Όμ˜ λ§€μΉ­ κ²°κ³Όλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€. g ν”Œλž˜κ·Έλ₯Ό μ§€μ •ν•˜λ©΄ λͺ¨λ“  λ§€μΉ­ κ²°κ³Όλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.

const target = "Is this all there is?"
const regExp1 = /is/
regExp1.match(target)
// ['is', index: 5, input: 'Is this all there is?', groups: undefined]

const regExp2 = /is/g
regExp2.match(target) // ["is", "is"]

31.4 ν”Œλž˜κ·Έ

νŒ¨ν„΄κ³Ό ν•¨κ»˜ μ •κ·œ ν‘œν˜„μ‹μ„ κ΅¬μ„±ν•˜λŠ” ν”Œλž˜κ·ΈλŠ” μ •κ·œ ν‘œν˜„μ‹μ˜ 검색 방식을 μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. μ˜΅μ…˜μ΄λ―€λ‘œ 선택할 수 있고, μˆœμ„œμ™€ 상관없이 ν•˜λ‚˜ μ΄μƒμ˜ ν”Œλž˜κ·Έλ₯Ό λ™μ‹œμ— μ„€μ •ν•  수 μžˆλ‹€.

ν”Œλž˜κ·Έ
의미
μ„€λͺ…

i

Ignore case

λŒ€μ†Œλ¬Έμž κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  νŒ¨ν„΄μ„ κ²€μƒ‰ν•œλ‹€.

g

Global

λŒ€μƒ λ¬Έμžμ—΄ λ‚΄ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λͺ¨λ“  λ¬Έμžμ—΄μ„ μ „μ—­ κ²€μƒ‰ν•œλ‹€.

m

Multi line

λ¬Έμžμ—΄μ˜ 행이 λ°”λ€Œλ”λΌλ„ νŒ¨ν„΄ 검색을 κ³„μ†ν•œλ‹€.


31.5 νŒ¨ν„΄

μ •κ·œ ν‘œν˜„μ‹μ€ νŒ¨ν„΄κ³Ό ν”Œλž˜κ·Έλ‘œ κ΅¬μ„±λœλ‹€. **νŒ¨ν„΄**은 λ¬Έμžμ—΄μ˜ μΌμ •ν•œ κ·œμΉ™μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λ©°, ν”Œλž˜κ·ΈλŠ” μ •κ·œ ν‘œν˜„μ‹μ˜ 검색 방식을 μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

νŒ¨ν„΄μ€ /둜 μ—΄κ³  λ‹«μœΌλ©° λ¬Έμžμ—΄μ˜ λ”°μ˜΄ν‘œλŠ” μƒλž΅ν•œλ‹€. λ˜ν•œ νŒ¨ν„΄μ€ νŠΉλ³„ν•œ 의미λ₯Ό κ°€μ§€λŠ” λ©”νƒ€μΈμžλ‚˜ 기호둜 ν‘œν˜„ν•  수 μžˆλ‹€. μ–΄λ–€ λ¬Έμžμ—΄ λ‚΄ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄μ΄ μ‘΄μž¬ν•  λ•Œ β€˜μ •κ·œ ν‘œν˜„μ‹κ³Ό λ§€μΉ˜ν•œλ‹€β€™κ³  ν‘œν˜„ν•œλ‹€.

31.5.1 λ¬Έμžμ—΄ 검색

/is/ // is λ¬Έμžμ—΄κ³Ό λ§€μΉ˜ν•˜λŠ” νŒ¨ν„΄. ν”Œλž˜κ·Έκ°€ μƒλž΅λ˜μ–΄ μ •κ·œν‘œν˜„μ‹κ³Ό λ§€μΉ˜ν•œ 첫 결과만 λ°˜ν™˜ν•œλ‹€.
/is/i // is λ¬Έμžμ—΄κ³Ό λ§€μΉ˜ν•˜λŠ” νŒ¨ν„΄. λŒ€μ†Œλ¬Έμž ꡬ뢄 X
/is/g // is λ¬Έμžμ—΄κ³Ό λ§€μΉ˜ν•˜λŠ” νŒ¨ν„΄. μ „μ—­ 검색

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

.은 μž„μ˜μ˜ 문자 ν•œ 개λ₯Ό μ˜λ―Έν•œλ‹€. λ‚΄μš©μ€ 상관없닀.

const target = "Is this all there is?"
const regExp = /.../g // μž„μ˜μ˜ 3자리 λ¬Έμžμ—΄κ³Ό λ§€μΉ˜ν•˜λŠ” νŒ¨ν„΄. μ „μ—­ 검색

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

31.5.3 반볡 검색

{m,n}은 μ•ž νŒ¨ν„΄μ΄ μ΅œμ†Œ m번, μ΅œλŒ€ n번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€.

{n}은 μ•ž νŒ¨ν„΄μ΄ n번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€.

{n,}은 μ•ž νŒ¨ν„΄μ΄ μ΅œμ†Œ n번 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€.

const target = "A AA B BB Aa Bb AAA"

const regExp = /A{1,2}/g // A κ°€ μ΅œμ†Œ 1번 μ΅œλŒ€ 2번 λ°˜λ³΅λ˜λŠ” νŒ¨ν„΄
target.match(regExp) // ['A', 'AA', 'A', 'AA', 'A']

const regExp2 = /A{2}/g // A κ°€ 2번 λ°˜λ³΅λ˜λŠ” νŒ¨ν„΄
target.match(regExp2) // ['AA', 'AA']

const regExp3 = /A{2,}/g // A κ°€ μ΅œμ†Œ 2번 λ°˜λ³΅λ˜λŠ” νŒ¨ν„΄
target.match(regExp3) // ['AA', 'AAA']

+λŠ” μ•ž νŒ¨ν„΄μ΄ μ΅œμ†Œ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€. 즉, {1,}κ³Ό κ°™λ‹€.

?λŠ” μ•ž νŒ¨ν„΄μ΄ μ΅œλŒ€ ν•œ 번(0번 포함) 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μ˜λ―Έν•œλ‹€. 즉, {0,1}κ³Ό κ°™λ‹€.

31.5.4 OR 검색

|λŠ” or의 의미λ₯Ό κ°–λŠ”λ‹€.

const target = "A AA B BB Aa Bb"
const regExp = /A|B/g // A λ˜λŠ” Bκ°€ ν¬ν•¨λœ νŒ¨ν„΄
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κ°€ ν¬ν•¨λœ 단어 레벨의 νŒ¨ν„΄
target.match(regExp)
// ['A', 'AA', 'B', 'BB', 'A', 'B']

|λ₯Ό κ°„λ‹¨νžˆ ν‘œν˜„ν•˜λ €λ©΄ [ ]λ₯Ό μ‚¬μš©ν•œλ‹€.

const target = "A AA B BB Aa Bb"
const regExp = /[AB]+/g // A λ˜λŠ” Bκ°€ ν¬ν•¨λœ 단어 레벨의 νŒ¨ν„΄
target.match(regExp)
// ['A', 'AA', 'B', 'BB', 'A', 'B']

λ²”μœ„λ₯Ό μ§€μ •ν•˜λ €λ©΄ []내에 -λ₯Ό μ‚¬μš©ν•œλ‹€.

const target = "A AA B BB Aa Bb 12"
const regExp = /[A-Z]+/g // A ~ Z κ°€ ν•œ 번 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄ νŒ¨ν„΄
target.match(regExp)
// ['A', 'AA', 'B', 'BB', 'A', 'B']

// λŒ€λ¬Έμž μ•ŒνŒŒλ²³ [A-Z]
// μ†Œλ¬Έμž μ•ŒνŒŒλ²³ [a-z]
// 숫자 [0-9] === [\\d] <=> μˆ«μžκ°€ μ•„λ‹Œ [\\D]
// μ•ŒνŒŒλ²³, 숫자, μ–Έλ”μŠ€μ½”μ–΄ [A-Za-z0-9_] === [\\w] <==> [\\W]

31.5.5 NOT 검색

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

// [^0-9] 숫자λ₯Ό μ œμ™Έν•œ 문자 === [\\D]

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

[…] λ°–μ˜ ^ λŠ” λ¬Έμžμ—΄μ˜ μ‹œμž‘μ„ μ˜λ―Έν•œλ‹€.

// /^http/ http둜 μ‹œμž‘ν•˜λŠ” νŒ¨ν„΄

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

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

// /com$/ com으둜 λλ‚˜λŠ” νŒ¨ν„΄

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

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

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

/^https?:\\/\\//.test(url) // true
// http:// λ˜λŠ” <https://둜> μ‹œμž‘ν•˜λŠ”μ§€ 검사

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

const fileName = 'index.html';
/html$/.test(fileName) // true
// html둜 λλ‚˜λŠ”μ§€ 검사

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

const target = '12345';
/^\\d+$/.test(target) // true
// 처음과 끝이 숫자인 νŒ¨ν„΄μ΄ ν•œλ²ˆ 이상 λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄

31.6.4 ν•˜λ‚˜ μ΄μƒμ˜ 곡백 검사

const target = " Hi!";
/^[\\s]+/.test(target) // true

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

const id = 'abc123';
/^[A-Za-z0-9]{4,10}$/.test(id) // true
// μ•ŒνŒŒλ²³ λŒ€μ†Œλ¬Έμž λ˜λŠ” 숫자둜 이루어진 4~10자리

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

const email = "onemorebottlee@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

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

const cellPhone = '010-1234-5678';
/^\\d{3}-\\d{3-4}-\\d{4}$/.test(cellPhone) // true

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

const target = 'abc#123';
(/[^A-Za-z0-9]/gi).test(target) // true

// ν˜Ήμ€
(/[\\{\\}\\[\\]\\/?.,;:|\\]*~`!^\\-_+<>@\\#$%&\\\\\\=\\(\\'\\"]/gi).test(target) // true

Last updated

Was this helpful?