๐Ÿ“ [JS ๊ณต๋ถ€๊ธฐ๋ก] ์ •๊ทœํ‘œํ˜„์‹(Regular Expression)

์ œ๋ก ยท2022๋…„ 4์›” 22์ผ
1

[JS ๊ณต๋ถ€๊ธฐ๋ก] TIL โœจ

๋ชฉ๋ก ๋ณด๊ธฐ
2/12

์ •๊ทœํ‘œํ˜„์‹ ๊ณต๋ถ€?

string ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ํŠน์ • ๋ฌธ์ž๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ slice, splice๋ฅผ ์“ฐ๊ธฐ์—๋Š” ์• ๋งคํ•˜๊ฑฐ๋‚˜ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ์„ ๋•Œ๋Š” ์ •๊ทœํ‘œํ˜„์‹์„ ์จ์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ •๊ทœํ‘œํ˜„์‹์ด ์›Œ๋‚™ ์ง๊ด€์ ์ด์ง€ ์•Š๊ฒŒ ์ƒ๊ฒจ์„œ ์ดํ•ด๊ฐ€ ์–ด๋ ค์šด๋ฐ์š”.
ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ์ฐพ์•„ ์“ฐ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ์ฐพ์•„๋ณด๋ ค๋ฉด ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋‘๋ฉด ๋‚˜์ค‘์— ์ดํ•ดํ•˜๊ธฐ๋„ ํŽธํ•˜๊ณ  ์‰ฝ๊ฒŒ ์ฐพ์•„ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ์ •๋ฆฌ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •๊ทœํ‘œํ˜„์‹์„ ๋‹ค๋ฃจ์ง€๋Š” ์•Š๊ณ  ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ •๊ทœํ‘œํ˜„์‹ ์œ„์ฃผ๋กœ ๊ธฐ๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ์ „์— ์ •๊ทœํ‘œํ˜„์‹์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์ž๋ฉด,

1. ๋ฌธ์ž๊ฒ€์ƒ‰(search)
2. ๋ฌธ์ž ๋Œ€์ฒด(replace)
3. ๋ฌธ์ž ์ถ”์ถœ(extract)

์ด ์„ธ๊ฐ€์ง€ ์—ญํ• ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JS ์ •๊ทœ์‹ ์ƒ์„ฑ

๋‘ ๊ฐ€์ง€ ์ •๊ทœ์‹ ์ƒ์„ฑ ๋ฐฉ์‹

JS์—์„œ๋Š” ์ •๊ทœ์‹์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์„ ์“ฐ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹๋„ ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

  1. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹
new RegExp('ํ‘œํ˜„', '์˜ต์…˜')

new RegEcp('[a-z]', 'gi') <- ์˜ˆ์‹œ
  1. ๋ฆฌํ„ฐ๋Ÿด(Literal) ๋ฐฉ์‹
/ํ‘œํ˜„/์˜ต์…˜

/[a-z]/gi <- ์˜ˆ์‹œ

ํ”Œ๋ž˜๊ทธ ์˜ต์…˜

์ •๊ทœํ‘œํ˜„์‹์˜ ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ฅธ ์˜ต์…˜์„ ์•Œ์•„๋ด…์‹œ๋‹ค.

  • g : ๋ชจ๋“  ๋ฌธ์ž ์ผ์น˜(global)

  • i : ์˜์–ด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ ์•Š๊ณ  ์ผ์น˜(ignore case)

  • m : ์—ฌ๋Ÿฌ ์ค„ ์ผ์น˜(multi line)

์œ„์™€ ๊ฐ™์€ ์˜ต์…˜๋“ค๋กœ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

ํŒจํ„ด(ํ‘œํ˜„)

์˜ต์…˜๋“ค์„ ํ™œ์šฉํ•ด์„œ ์–ด๋– ํ•œ ํŒจํ„ด๋“ค๋กœ ์ •๊ทœํ‘œํ˜„์‹์ด ํ™œ์šฉ๋˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค!

^ab - ์ค„(Line) ์‹œ์ž‘์— ์žˆ๋Š” ab์™€ ์ผ์น˜

console.log(
	str.match(/^t/gm)
)

=> ํ•œ ๋ผ์ธ์—์„œ t ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ab$ - ์ค„(Line) ๋์— ์žˆ๋Š” ab์™€ ์ผ์น˜

console.log(
	str.match(/d$/gm)
)

=> ํ•œ ๋ผ์ธ์—์„œ d๋กœ ๋๋‚˜๋Š” ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

. - ์ž„์˜์˜ ํ•œ ๋ฌธ์ž์™€ ์ผ์น˜

console.log(
	str.match(/a.c/gm)
)

=> ํ•œ ๋ผ์ธ์—์„œ a ์™€ c ๋ฅผ ์–‘ ๋์œผ๋กœ ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

a | b - a ๋˜๋Š” b ์™€ ์ผ์น˜

console.log(
	str.match(/fox|dog/gm)
)

=> fox์ด๊ฑฐ๋‚˜ dog์ธ ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋จผ์ € ์ฐพ์€ ๊ฒƒ์„ ์ถœ๋ ฅ

ab? - b๊ฐ€ ์—†๊ฑฐ๋‚˜ b์™€ ์ผ์น˜

console.log(
	str.match(/https?/g)
)

=> s ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” http ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

{3} - 3๊ฐœ ์—ฐ์† ์ผ์น˜

{3, } - 3๊ฐœ ์ด์ƒ ์—ฐ์† ์ผ์น˜

{3, 5} - 3๊ฐœ ์ด์ƒ 5๊ฐœ ์ดํ•˜(3~5) ์—ฐ์† ์ผ์น˜

console.log(
	str.match(/d{2}/g)
)

=> d ๊ฐ€ ๋‘ ๊ฐœ ์—ฐ์†๋œ ๋ฌธ์ž ์ถœ๋ ฅํ•œ๋‹ค.

console.log(
	str.match(/d{2, }/g)
)

=> d ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์—ฐ์†๋œ ๋ฌธ์ž ์ถœ๋ ฅํ•œ๋‹ค.

console.log(
	str.match(0-9{1, 3})
)

=> 0 ~ 9 ์ˆซ์ž ์‚ฌ์ด์˜ 1๊ฐœ์—์„œ 3๊ฐœ ์ด์ƒ ์—ฐ์†๋œ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

[a-z] | a๋ถ€ํ„ฐ z ์‚ฌ์ด์˜ ๋ฌธ์ž ๊ตฌ๊ฐ„์— ์ผ์น˜(์˜์–ด ์†Œ๋ฌธ์ž)

[A-Z] | A๋ถ€ํ„ฐ Z ์‚ฌ์ด์˜ ๋ฌธ์ž ๊ตฌ๊ฐ„์— ์ผ์น˜(์˜์–ด ๋Œ€๋ฌธ์ž)

[0-9] | 0๋ถ€ํ„ฐ 9 ์‚ฌ์ด์˜ ๋ฌธ์ž ๊ตฌ๊ฐ„์— ์ผ์น˜(์ˆซ์ž)

[๊ฐ€-ํžฃ] | ๊ฐ€๋ถ€ํ„ฐ ํžฃ ์‚ฌ์ด์˜ ๋ฌธ์ž ๊ตฌ๊ฐ„์— ์ผ์น˜(ํ•œ๊ธ€)

console.log(str.match(/\bf\w{1, }\b/g))

=> 63๊ฐœ ๋ฌธ์ž์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ„๋กœ ๋ฐ”๊ฟˆ(์†Œ๋ฌธ์ž f๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์˜๋‹จ์–ด ์ฐพ๊ธฐ)

const h = '    the   hello   wrold    !'

console.log(
	h.replace(/\s/g, '')
)

=> ๊ณต๋ฐฑ์„ ์ง€์›Œ์ฃผ๋Š” ์ฝ”๋“œ

(?=) | ์•ž์ชฝ ์ผ์น˜(Lookahead)

(?<=) | ๋’ค์ชฝ ์ผ์น˜(Lookbehind)

str = "asdf1234@naver.com"

console.log(
	str.match(/.{1, }(?=@)/g)
)

=> @ ์•ž์ชฝ์˜ ์•„์ด๋”” ๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.

str = "asdf1234@naver.com"

console.log(
	str.match(/(?<=@).{1, }/g)
)

=> @ ๋’ค์— ๋ถ€๋ถ„์„ ์ฐพ์•„ ์ค„๋ ฅํ•œ๋‹ค.

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์€ ์‚ฌ์ดํŠธ

RegExr: Learn, Build, & Test RegEx

์ด๊ณณ์—์„œ ์ •๊ทœํ‘œํ˜„์‹์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

profile
Software Developer

0๊ฐœ์˜ ๋Œ“๊ธ€