Regex

  • ํŠน์ •ํ•œ ๊ทœ์น™์„ ๊ฐ€์ง„ ๋ฌธ์ž์—ด์˜ ์ง‘ํ•ฉ์„ ํ‘œํ˜„

์ •๊ทœ ํ‘œํ˜„์‹ ๋งŒ๋“ค๊ธฐ

  1. ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ„ด์„ ์Šฌ๋ž˜์‹œ(/)๋กœ ๊ฐ์‹ธ๊ธฐ

  2. RegExp ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•˜๊ธฐ

const re = /ab/i
const re = new RegExp("ab")

์ •๊ทœ ํ‘œํ˜„์‹ ํ”Œ๋ž˜๊ทธ

i (ignore case)

  • ์ •๊ทœ ํ‘œํ˜„์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  • ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ex. /abc/i๋Š” ABC์—๋„ ๋งค์นญ์ด ๋œ๋‹ค.

console.log("ABC".match(/abc/)) // null
console.log("ABC".match(/abc/i)) // ["ABC"]
  • ์ •๊ทœ ํ‘œํ˜„์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ •๊ทœ ํ‘œํ˜„์‹์ด ๋ชจ๋“  ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.

const str = "abcABC"
console.log(str.match(/a/i)) // ["a"]
console.log(str.match(/a/gi)) // ["a","A"]

m (multi line)

  • ์‹œ์ž‘๊ณผ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ์•ต์ปค(^, &)๊ฐ€ ์ „์ฒด ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘๊ณผ ๋์ด ์•„๋‹Œ ์ค„์˜ ์‹œ์ž‘๊ณผ ๋์— ์ผ์น˜๋ฉ๋‹ˆ๋‹ค.

const str = "hello world\nhello regex";
console.log(str.match(/^hello/)); // ["hello"]
console.log(str.match(/^hello/gm)); // ["hello", "hello"]

u (unicode)

  • ํ™•์žฅ๋œ ์œ ๋‹ˆ์ฝ”๋“œ ์ด์Šค์ผ€์ดํ”„๋ฅผ ์ง€์›.

  • ์ธ์‹ํ•  ์ˆ˜ ์—†๋Š” ์ด์Šค์ผ€์ดํ”„์— ๋Œ€ํ•ด์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด

y (sticky)

  • ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ์œ„์น˜์—์„œ๋งŒ ์ผ์น˜ํ•˜๊ณ  ์ „์—ญ ํ”Œ๋ž˜๊ทธ(g)๋ฅผ ๋ฌด์‹œ

s (dotall)

  • ์ (.)์ด ์ƒˆ ์ค„์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ๋ฌธ์ž์™€ ์ผ์น˜ํ•˜๊ฒŒ ๋จ

๋ฌธ์ž ํด๋ž˜์Šค

ํŒจํ„ด์˜๋ฏธ์„ค๋ช…๋™์ผ

[abc]

abc์ค‘ ์–ด๋Š ํ•˜๋‚˜

[^abc]

abc๊ฐ€ ์•„๋‹Œ ๊ฒƒ

[a-g]

a์™€ g ์‚ฌ์ด์˜ ๋ฌธ์ž

.

์ƒˆ ์ค„(\n \r \u2028 \u2029)์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฌธ์ž

'abcabcda'์—์„œ /.a/ -> 'abcabcda'

\w

์˜์ˆซ์ž ๋ฐ ์–ธ๋”์Šค์ฝ”์–ด.

'ab_cd.com'์—์„œ \w -> 'ab_cd$com'

[A-Za-z0-9_]

\W

/w๊ฐ€ ์•„๋‹Œ ๊ฒƒ.

'ab_cd.com'์—์„œ \w -> 'ab_cd**$**com'

[^A-Za-z0-9_]

\d

์ˆซ์ž.

'apple1234'์—์„œ \d -> 'apple1234'

[0-9]

\D

์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ.

'apple1234'์—์„œ \d -> 'apple1234'

[^0-9]

\s

whitespace

'one man'์—์„œ \s -> 'oneโ– man'

[\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

\S

whitespace๊ฐ€ ์•„๋‹Œ ๊ฒƒ

'one man'์—์„œ \S -> 'oneโ–กman'

[^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

์ˆ˜ํ‰ ํƒญ(horizontal tab)

Tab ํ‚ค

\v

์ˆ˜์ง ํƒญ(vertical tab)

์บ๋ฆฌ์ง€ ๋ฆฌํ„ด(carriage return)

์ƒˆ ์ค„์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ œ์–ด ๋ฌธ์ž

๋ผ์ธ ํ”ผ๋“œ(linefeed)

์ปค์„œ๋ฅผ ๋‹ค์Œ ์ค„๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ

\f

ํผ ํ”ผ๋“œ(form-feed)

์ƒˆ ๋ฌธ์„œ ํŽ˜์ด์ง€์ž„์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ

\0

NUL ๋ฌธ์ž

๋’ค์— ์ˆซ์ž๊ฐ€ ์ด์–ด์ง€๋ฉด ์•ˆ

x|y

๋…ผ๋ฆฌ ํ•ฉ

"x" ๋˜๋Š” "y"

์–ด์„œ์…˜

  • ๋‹จ์–ด ๋˜๋Š” ๋ผ์ธ์˜ ์‹œ์ž‘๊ณผ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ๊ณ„๋ฅผ ํฌํ•จ

  • ๋งค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•จ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ช‡ ๊ฐ€์ง€ ํŒจํ„ด์„ ํฌํ•จ

Boundary-type assertions

๋ฌธ์ž์˜๋ฏธ

^

์ž…๋ ฅ์˜ ์‹œ์ž‘๊ณผ ์ผ์น˜. ๋ฉ€ํ‹ฐ ๋ผ์ธ์ด ์„ค์ •๋œ ๊ฒฝ์šฐ, ์ค„ ๋ฐ”๊ฟˆ ๋ฐ”๋กœ ๋’ค์—๋„ ์ผ์น˜

$

์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰๊ณผ ์ผ์น˜. ๋ฉ€ํ‹ฐ ๋ผ์ธ์ด ์„ค์ •๋œ ๊ฒฝ์šฐ, ์ค„ ๋ฐ”๊ฟˆ ๋ฐ”๋กœ ์ด์ „์—๋„ ์ผ์น˜

\b

๋‹จ์–ด ๊ฒฝ๊ณ„์™€ ์ผ์น˜. ๋’ค์— ๋‹ค๋ฅธ ๋‹จ์–ด๊ฐ€ ์˜ค์ง€ ์•Š๊ฑฐ๋‚˜, ์•ž์— ๋‹ค๋ฅธ ๋‹จ์–ด๊ฐ€ ์˜ค์ง€ ์•Š๋Š” ์œ„์น˜

\B

๋‹จ์–ด๊ฐ€ ์•„๋‹Œ ๊ฒฝ๊ณ„์™€ ์ผ์น˜. ์ด์ „ ๋ฌธ์ž์™€ ๋‹ค์Œ ๋ฌธ์ž๊ฐ€ ๊ฐ™์€ ์œ ํ˜•์ธ ์œ„์น˜

other assertions

๋ฌธ์ž์˜๋ฏธ

x(?=y)

Lookahead: "x" ๋’ค์— "y"๊ฐ€ ์˜ค๋Š” ๊ฒฝ์šฐ์—๋งŒ "x"์— ์ผ์น˜

x(?!y)

Negative lookahead: "x" ๋’ค์— 'y'๊ฐ€ ์˜ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ "x"์— ์ผ์น˜

(?<=y)x

Lookbehind: "x" ์•ž์— "y"๊ฐ€ ์˜ค๋Š” ๊ฒฝ์šฐ์—๋งŒ "x"์— ์ผ์น˜

(?<!y)x

Negative lookbehind: "x" ์•ž์— "y"๊ฐ€ ์˜ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ "x"์— ์ผ์น˜

๊ทธ๋ฃน

  • ๊ธ€๋ถ€ ์บก์ฒ˜๋ง: ์—ฌ๋Ÿฌ ํŒจํ„ด์„ ๋ฌถ์–ด ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ๊ธฐ์–ต

  • ์—ญ์ฐธ์กฐ: ๋™์ผํ•œ ์ •๊ทœ์‹์—์„œ ์ด์ „์— ์บก์ณ๋œ ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ

  • ๊ทธ๋ฃน ์บก์ฒ˜๋ง์€ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋ฏ€๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ

๋ฌธ์ž์˜๋ฏธ

(x)

Capturing group: x์— ์ผ์น˜ํ•˜๊ณ  ์ผ์น˜ํ•œ ๊ฒƒ์„ ๊ธฐ์–ต

(?<Name>x)

Named capturing group: ์ผ์น˜ํ•œ ๊ฒƒ์„ <Name>์— ๊ธฐ์–ต

(?:*x*)

Non-capturing group: "x"์— ์ผ์น˜ํ•˜์ง€๋งŒ, ์ผ์น˜ ํ•ญ๋ชฉ์„ ๊ธฐ์–ตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์—ญ์ฐธ์กฐ (n์€ ์–‘์˜ ์ •์ˆ˜). ์ •๊ทœ์‹์˜ n๋ฒˆ์งธ ๊ด„ํ˜ธ์™€ ๋งค์นญํ•˜๋Š” ํ•˜์œ„ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์—ญ์ฐธ์กฐ

\k<Name>

Named capture group์— ๋Œ€ํ•œ ์—ญ์ฐธ์กฐ

์ˆ˜๋Ÿ‰์ž

  • ๋ฌธ์ž๋‚˜ ํ‘œํ˜„์‹์˜ ์ผ์น˜ ๊ฐœ์ˆ˜๋ฅผ ํ‘œํ˜„

๋ฌธ์ž์˜๋ฏธ

x*

"x"๋ฅผ 0ํšŒ ์ด์ƒ ์ผ์น˜

x+

"x"๋ฅผ 1ํšŒ ์ด์ƒ ์ผ์น˜

x?

"x"๋ฅผ 0ํšŒ ๋˜๋Š” 1ํšŒ ์ผ์น˜

x{n}

"x"์˜ "n"ํšŒ ๋ฐœ์ƒ๊ณผ ์ผ์น˜ (n์€ ์–‘์˜ ์ •์ˆ˜)

x{n,}

"x"์˜ "n"ํšŒ ์ด์ƒ ๋ฐœ์ƒ๊ณผ ์ผ์น˜ (n์€ ์–‘์˜ ์ •์ˆ˜)

x{n,m}

"x"์˜ "n"ํšŒ ์ด์ƒ "m"ํšŒ ์ดํ•˜ ๋ฐœ์ƒ๊ณผ ์ผ์น˜ (n,m์€ ์–‘์˜ ์ •์ˆ˜, 0 โ‰ค n < m)

x**? x+? x?? x{n}? x{n,}? x{n,m}?

๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰์ž๋Š” "greedy" -> ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜์‹œํ‚ค๋ ค ํ•จ ์ˆ˜๋Ÿ‰์ž ๋’ค์— ?๋ฅผ ์ง€์ •ํ•˜์—ฌ "lazy"๋กœ ๋งŒ๋“ฆ -> ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์œผ๋ฉด ๋ฐ”๋กœ ๋ฉˆ์ถค

์˜ˆ์ œ

์ˆซ์ž๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€

  • ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜์—ฌ(^\d) ๋ฐ˜๋ณตํ•˜๊ณ (+) ๋งˆ์ง€๋ง‰์— ๋„๋‹ฌ($)

/^\d+$/

์˜๋ฌธ, ์ˆซ์ž, .์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€

/^[A-za-z0-9.]+$/

์•„์ด๋”” ๊ฒ€์‚ฌ

  • 4 ๊ธ€์ž ์ด์ƒ 12๊ธ€์ž ์ดํ•˜์˜ ์˜๋ฌธ ์ˆซ์ž ํฌํ•จ

/^[A-Za-z0-9]{4,12}$/

์ „ํ™”๋ฒˆํ˜ธ ๊ฒ€์‚ฌ

  • ์œ ์„  ์ „ํ™”๋ฒˆํ˜ธ: ์ง€์—ญ ๋ฒˆํ˜ธ(2,3) + ๊ตญ๋ฒˆ(3) + ์ „ํ™”๋ฒˆํ˜ธ(4)

/^\d{2,3}-\d{3,4}-\d{4}$/
  • ๋ฌด์„  ์ „ํ™”๋ฒˆํ˜ธ: ํ†ต์‹ ์‚ฌ ์‹๋ณ„๋ฒˆํ˜ธ(3,4) + ์ „ํ™” ๋ฒˆํ˜ธ(8)

/^\d{3,4}-\d{3,4}-\d{4}$/

์ด๋ฉ”์ผ ๊ฒ€์‚ฌ

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

์šฐํŽธ๋ฒˆํ˜ธ ๊ฒ€์‚ฌ

  • 5์ž๋ฆฌ ์ˆซ์ž

/^\d{5}$/

URL ๊ฒ€์‚ฌ

  • ์ „์ฒด URL ๋˜๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ƒ๋žตํ•œ URL

/^(https?:\/\/)?([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(:[0-9]+)?(\/.*)?$/

๋‚ ์งœ ๊ฒ€์‚ฌ

  • YYYY-MM-DD ํ˜•์‹ ๋‚ ์งœ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ

/^(?:[0-9]{4})-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$/

์‹œ๊ฐ„ ๊ฒ€์‚ฌ

  • hh:mm ํ˜•์‹ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ

/^(?:[01]\d|2[0-3]):[0-5]\d$/

ํŠน์ • ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์˜ ์ด๋ฆ„ ์ถ”์ถœ

  • ํŠน์ • ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ ์ด๋ฆ„์—์„œ ํ™•์žฅ์ž๋ฅผ ์ œ์™ธํ•œ ์ด๋ฆ„๋งŒ ์ถ”์ถœ

  • fewfw.twe.txt.txt.txt -> fewfw.twe.txt.txt.txt

^.+(?=.txt)

ํŒŒ์ผ ์ด๋ฆ„์—์„œ ์ด๋ฆ„๊ณผ ํ™•์žฅ์ž๋ฅผ ๋”ฐ๋กœ ์ถ”์ถœ

  • abc.txt -> ["abc","txt"]

^(.+)\.(\w+)$

IPv4 ๊ฒ€์‚ฌ

/^((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]?)$/

Last updated