์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ๊ณ ๊ธ JavaScript ํจํด ๋งค์นญ์ ํ์ํฉ๋๋ค. ํจ์จ์ ์ด๊ณ ๊ฐ๋ ฅํ ์ฝ๋๋ฅผ ์ํ ์ ๊ท์ ๊ตฌ๋ฌธ, ์ค์ ์ ์ฉ ๋ฐ ์ต์ ํ ๊ธฐ์ ์ ๋ํด ์์๋ณด์ธ์.
์ ๊ท ํํ์์ ์ด์ฉํ JavaScript ํจํด ๋งค์นญ: ์ข ํฉ ๊ฐ์ด๋
์ ๊ท ํํ์(regex)์ JavaScript์์ ํจํด ๋งค์นญ ๋ฐ ํ ์คํธ ์กฐ์์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๊ฐ๋ฐ์๋ ์ ์๋ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์์ด์ ๊ฒ์, ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ๋ณํํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋๋ JavaScript์ ์ ๊ท ํํ์์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ๋ฉฐ ๊ตฌ๋ฌธ, ์ฌ์ฉ๋ฒ ๋ฐ ๊ณ ๊ธ ๊ธฐ์ ์ ๋ค๋ฃน๋๋ค.
์ ๊ท ํํ์์ด๋ ๋ฌด์์ ๋๊น?
์ ๊ท ํํ์์ ๊ฒ์ ํจํด์ ์ ์ํ๋ ๋ฌธ์ ์ํ์ค์ ๋๋ค. ์ด๋ฌํ ํจํด์ ๋ฌธ์์ด์ ์ผ์น์ํค๊ณ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ๊ท ํํ์์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ํ๋ก๊ทธ๋๋ฐ์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ: ์ฌ์ฉ์ ์ ๋ ฅ์ด ํน์ ํ์(์: ์ด๋ฉ์ผ ์ฃผ์, ์ ํ ๋ฒํธ)์ ์ค์ํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ถ์ถ: ํ ์คํธ์์ ํน์ ์ ๋ณด ๊ฒ์(์: ๋ ์ง, URL ๋๋ ๊ฐ๊ฒฉ ์ถ์ถ).
- ๊ฒ์ ๋ฐ ๋ฐ๊พธ๊ธฐ: ๋ณต์กํ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ๋ฅผ ์ฐพ๊ณ ๋ฐ๊ฟ๋๋ค.
- ํ ์คํธ ์ฒ๋ฆฌ: ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ๋ฌธ์์ด์ ๋ถํ , ๊ฒฐํฉ ๋๋ ๋ณํํฉ๋๋ค.
JavaScript์์ ์ ๊ท ํํ์ ๋ง๋ค๊ธฐ
JavaScript์์ ์ ๊ท ํํ์์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
- ์ ๊ท ํํ์ ๋ฆฌํฐ๋ด ์ฌ์ฉ: ์ฌ๋์(/) ์์ ํจํด์ ๋ฌถ์ต๋๋ค.
RegExp์์ฑ์ ์ฌ์ฉ: ํจํด์ ๋ฌธ์์ด๋ก ์ฌ์ฉํ์ฌRegExp๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
์:
// ์ ๊ท ํํ์ ๋ฆฌํฐ๋ด ์ฌ์ฉ
const regexLiteral = /hello/;
// RegExp ์์ฑ์ ์ฌ์ฉ
const regexConstructor = new RegExp("hello");
๋ ๋ฐฉ๋ฒ ์ค ์ ํ์ ํจํด์ด ์ปดํ์ผ ํ์์ ์๋ ค์ ธ ์๋์ง ๋๋ ๋์ ์ผ๋ก ์์ฑ๋๋์ง์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ํจํด์ด ๊ณ ์ ๋์ด ๋ฏธ๋ฆฌ ์๋ ค์ง ๊ฒฝ์ฐ ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ํจํด์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋น๋ํด์ผ ํ๋ ๊ฒฝ์ฐ, ํนํ ๋ณ์๋ฅผ ํตํฉํ ๋ ์์ฑ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ๋ณธ ์ ๊ท์ ๊ตฌ๋ฌธ
์ ๊ท ํํ์์ ์ผ์น์ํฌ ํจํด์ ๋ํ๋ด๋ ๋ฌธ์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์ ๊ท์ ๊ตฌ์ฑ ์์์ ๋๋ค.
- ๋ฆฌํฐ๋ด ๋ฌธ์: ๋ฌธ์ ์์ฒด์ ์ผ์นํฉ๋๋ค(์:
/a/๋ ๋ฌธ์ 'a'์ ์ผ์น). - ๋ฉํ ๋ฌธ์: ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค(์:
.,^,$,*,+,?,[],{},(),\,|). - ๋ฌธ์ ํด๋์ค: ๋ฌธ์ ์งํฉ์ ๋ํ๋
๋๋ค(์:
[abc]๋ 'a', 'b' ๋๋ 'c'์ ์ผ์น). - ์๋์: ๋ฌธ์ ๋๋ ๊ทธ๋ฃน์ด ๋ฐ์ํด์ผ ํ๋ ํ์๋ฅผ ์ง์ ํฉ๋๋ค(์:
*,+,?,{n},{n,},{n,m}). - ์ต์ปค: ๋ฌธ์์ด์ ์์น์ ์ผ์นํฉ๋๋ค(์:
^๋ ์์ ๋ถ๋ถ๊ณผ ์ผ์น,$๋ ๋ ๋ถ๋ถ๊ณผ ์ผ์น).
์ผ๋ฐ์ ์ธ ๋ฉํ ๋ฌธ์:
.(์ ): ์ค ๋ฐ๊ฟ์ ์ ์ธํ ๋ชจ๋ ๋จ์ผ ๋ฌธ์์ ์ผ์นํฉ๋๋ค.^(์บ๋ฟ): ๋ฌธ์์ด์ ์์ ๋ถ๋ถ๊ณผ ์ผ์นํฉ๋๋ค.$(๋ฌ๋ฌ): ๋ฌธ์์ด์ ๋ ๋ถ๋ถ๊ณผ ์ผ์นํฉ๋๋ค.*(๋ณํ): ์ ํ ๋ฌธ์ ๋๋ ๊ทธ๋ฃน์ 0ํ ์ด์ ๋ฐ์๊ณผ ์ผ์นํฉ๋๋ค.+(๋ํ๊ธฐ): ์ ํ ๋ฌธ์ ๋๋ ๊ทธ๋ฃน์ 1ํ ์ด์ ๋ฐ์๊ณผ ์ผ์นํฉ๋๋ค.?(๋ฌผ์ํ): ์ ํ ๋ฌธ์ ๋๋ ๊ทธ๋ฃน์ 0ํ ๋๋ 1ํ ๋ฐ์๊ณผ ์ผ์นํฉ๋๋ค. ์ ํ์ ๋ฌธ์์ ์ฌ์ฉ๋ฉ๋๋ค.[](๋๊ดํธ): ๋๊ดํธ ์์ ๋ชจ๋ ๋จ์ผ ๋ฌธ์์ ์ผ์นํ๋ ๋ฌธ์ ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค.{}(์ค๊ดํธ): ์ผ์น์ํฌ ๋ฐ์ ํ์๋ฅผ ์ง์ ํฉ๋๋ค.{n}์ ์ ํํ n๋ฒ ์ผ์น,{n,}์ n๋ฒ ์ด์ ์ผ์น,{n,m}์ n๋ฒ๊ณผ m๋ฒ ์ฌ์ด๋ก ์ผ์นํฉ๋๋ค.()(๊ดํธ): ๋ฌธ์๋ฅผ ํจ๊ป ๊ทธ๋ฃนํํ๊ณ ์ผ์นํ๋ ํ์ ๋ฌธ์์ด์ ์บก์ฒํฉ๋๋ค.\(๋ฐฑ์ฌ๋์): ๋ฉํ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํ์ฌ ๋ฆฌํฐ๋ด๋ก ์ผ์น์ํฌ ์ ์์ต๋๋ค.|(ํ์ดํ): "or" ์ฐ์ฐ์ ์ญํ ์ ํ๋ฉฐ, ์์ด๋ ๋ค์ ํํ์๊ณผ ์ผ์นํฉ๋๋ค.
๋ฌธ์ ํด๋์ค:
[abc]: ๋ฌธ์ a, b ๋๋ c ์ค ํ๋์ ์ผ์นํฉ๋๋ค.[^abc]: a, b ๋๋ c๊ฐ ์๋ ๋ฌธ์์ ์ผ์นํฉ๋๋ค.[a-z]: a์์ z๊น์ง์ ๋ชจ๋ ์๋ฌธ์์ ์ผ์นํฉ๋๋ค.[A-Z]: A์์ Z๊น์ง์ ๋ชจ๋ ๋๋ฌธ์์ ์ผ์นํฉ๋๋ค.[0-9]: 0์์ 9๊น์ง์ ๋ชจ๋ ์ซ์์ ์ผ์นํฉ๋๋ค.[a-zA-Z0-9]: ๋ชจ๋ ์์ซ์์ ์ผ์นํฉ๋๋ค.\d: ๋ชจ๋ ์ซ์์ ์ผ์นํฉ๋๋ค([0-9]๊ณผ ๋์ผ).\D: ์ซ์๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์์ ์ผ์นํฉ๋๋ค([^0-9]๊ณผ ๋์ผ).\w: ๋ชจ๋ ๋จ์ด ๋ฌธ์(์์ซ์ + ๋ฐ์ค,[a-zA-Z0-9_]๊ณผ ๋์ผ)์ ์ผ์นํฉ๋๋ค.\W: ๋จ์ด๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์([^a-zA-Z0-9_]๊ณผ ๋์ผ)์ ์ผ์นํฉ๋๋ค.\s: ๋ชจ๋ ๊ณต๋ฐฑ ๋ฌธ์(๊ณต๋ฐฑ, ํญ, ์ค ๋ฐ๊ฟ ๋ฑ)์ ์ผ์นํฉ๋๋ค.\S: ๊ณต๋ฐฑ์ด ์๋ ๋ชจ๋ ๋ฌธ์์ ์ผ์นํฉ๋๋ค.
์๋์:
*: ์ ํ ์์์ 0ํ ์ด์ ์ผ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ดa*๋ "", "a", "aa", "aaa" ๋ฑ๊ณผ ์ผ์นํฉ๋๋ค.+: ์ ํ ์์์ 1ํ ์ด์ ์ผ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ดa+๋ "a", "aa", "aaa"์ ์ผ์นํ์ง๋ง ""์๋ ์ผ์นํ์ง ์์ต๋๋ค.?: ์ ํ ์์์ 0ํ ๋๋ 1ํ ์ผ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ดa?๋ "" ๋๋ "a"์ ์ผ์นํฉ๋๋ค.{n}: ์ ํ ์์์ ์ ํํ n๋ฒ ์ผ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ดa{3}๋ "aaa"์ ์ผ์นํฉ๋๋ค.{n,}: ์ ํ ์์์ n๋ฒ ์ด์ ์ผ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ดa{2,}๋ "aa", "aaa", "aaaa" ๋ฑ๊ณผ ์ผ์นํฉ๋๋ค.{n,m}: ์ ํ ์์์ n๋ฒ๊ณผ m๋ฒ ์ฌ์ด๋ก ์ผ์นํฉ๋๋ค(ํฌํจ). ์๋ฅผ ๋ค์ดa{2,4}๋ "aa", "aaa" ๋๋ "aaaa"์ ์ผ์นํฉ๋๋ค.
์ต์ปค:
^: ๋ฌธ์์ด์ ์์ ๋ถ๋ถ๊ณผ ์ผ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ด^Hello๋ "Hello"๋ก ์์ํ๋ ๋ฌธ์์ด๊ณผ ์ผ์นํฉ๋๋ค.$: ๋ฌธ์์ด์ ๋ ๋ถ๋ถ๊ณผ ์ผ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ดWorld$๋ "World"๋ก ๋๋๋ ๋ฌธ์์ด๊ณผ ์ผ์นํฉ๋๋ค.\b: ๋จ์ด ๊ฒฝ๊ณ์ ์ผ์นํฉ๋๋ค. ์ด๋ ๋จ์ด ๋ฌธ์(\w)์ ๋จ์ด๊ฐ ์๋ ๋ฌธ์(\W) ์ฌ์ด ๋๋ ๋ฌธ์์ด์ ์์ ๋๋ ๋ ์์น์ ๋๋ค. ์๋ฅผ ๋ค์ด\bword\b๋ ์ ์ฒด ๋จ์ด "word"์ ์ผ์นํฉ๋๋ค.
ํ๋๊ทธ:
์ ๊ท์ ํ๋๊ทธ๋ ์ ๊ท ํํ์์ ๋์์ ์์ ํฉ๋๋ค. ์ ๊ท์ ๋ฆฌํฐ๋ด์ ๋์ ์ถ๊ฐํ๊ฑฐ๋ RegExp ์์ฑ์์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
g(์ ์ญ): ์ฒซ ๋ฒ์งธ ์ผ์น ํญ๋ชฉ๋ฟ๋ง ์๋๋ผ ํจํด์ ๋ชจ๋ ์ผ์น ํญ๋ชฉ๊ณผ ์ผ์นํฉ๋๋ค.i(๋์๋ฌธ์ ๋ฌด์): ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ผ์น๋ฅผ ์ํํฉ๋๋ค.m(์ฌ๋ฌ ์ค): ์ฌ๋ฌ ์ค ๋ชจ๋๋ฅผ ํ์ฑํํฉ๋๋ค. ์ฌ๊ธฐ์^๋ฐ$๋ ๊ฐ ์ค์ ์์๊ณผ ๋(\n์ผ๋ก ๊ตฌ๋ถ๋จ)๊ณผ ์ผ์นํฉ๋๋ค.s(dotAll): ์ (.)์ด ์ค ๋ฐ๊ฟ ๋ฌธ์์๋ ์ผ์นํ๋๋ก ํ์ฉํฉ๋๋ค.u(์ ๋์ฝ๋): ์ ์ฒด ์ ๋์ฝ๋ ์ง์์ ํ์ฑํํฉ๋๋ค.y(sticky): ์ ๊ท์์lastIndex์์ฑ์ผ๋ก ํ์๋ ์ธ๋ฑ์ค์์๋ง ์ผ์นํฉ๋๋ค.
JavaScript ์ ๊ท์ ๋ฉ์๋
JavaScript๋ ์ ๊ท ํํ์ ์์ ์ ์ํ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
test(): ๋ฌธ์์ด์ด ํจํด๊ณผ ์ผ์นํ๋์ง ํ ์คํธํฉ๋๋ค.true๋๋false๋ฅผ ๋ฐํํฉ๋๋ค.exec(): ๋ฌธ์์ด์์ ์ผ์น ํญ๋ชฉ์ ๊ฒ์ํฉ๋๋ค. ์ผ์นํ๋ ํ ์คํธ์ ์บก์ฒ๋ ๊ทธ๋ฃน์ด ํฌํจ๋ ๋ฐฐ์ด์ ๋ฐํํ๊ฑฐ๋, ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉดnull์ ๋ฐํํฉ๋๋ค.match(): ์ ๊ท ํํ์์ ๋ํด ๋ฌธ์์ด์ ์ผ์น์ํจ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.gํ๋๊ทธ์ ์ ๋ฌด์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค.search(): ๋ฌธ์์ด์์ ์ผ์น ํญ๋ชฉ์ ํ ์คํธํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ผ์น ํญ๋ชฉ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๊ฑฐ๋, ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด -1์ ๋ฐํํฉ๋๋ค.replace(): ํจํด์ ๋ฐ์์ ๋์ฒด ๋ฌธ์์ด ๋๋ ๋์ฒด ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์๋ก ๋ฐ๊ฟ๋๋ค.split(): ์ ๊ท ํํ์์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์์ด์ ํ์ ๋ฌธ์์ด ๋ฐฐ์ด๋ก ๋ถํ ํฉ๋๋ค.
์ ๊ท์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์:
// test()
const regex = /hello/;
const str = "hello world";
console.log(regex.test(str)); // ์ถ๋ ฅ: true
// exec()
const regex2 = /hello (\w+)/;
const str2 = "hello world";
const result = regex2.exec(str2);
console.log(result); // ์ถ๋ ฅ: ["hello world", "world", index: 0, input: "hello world", groups: undefined]
// 'g' ํ๋๊ทธ๊ฐ ์๋ match()
const regex3 = /\d+/g; // ํ๋ ์ด์์ ์ซ์๋ฅผ ์ ์ญ์ ์ผ๋ก ์ผ์น์ํต๋๋ค.
const str3 = "There are 123 apples and 456 oranges.";
const matches = str3.match(regex3);
console.log(matches); // ์ถ๋ ฅ: ["123", "456"]
// 'g' ํ๋๊ทธ๊ฐ ์๋ match()
const regex4 = /\d+/;
const str4 = "There are 123 apples and 456 oranges.";
const match = str4.match(regex4);
console.log(match); // ์ถ๋ ฅ: ["123", index: 11, input: "There are 123 apples and 456 oranges.", groups: undefined]
// search()
const regex5 = /world/;
const str5 = "hello world";
console.log(str5.search(regex5)); // ์ถ๋ ฅ: 6
// replace()
const regex6 = /world/;
const str6 = "hello world";
const newStr = str6.replace(regex6, "JavaScript");
console.log(newStr); // ์ถ๋ ฅ: hello JavaScript
// ํจ์๊ฐ ์๋ replace()
const regex7 = /(\d+)-(\d+)-(\d+)/;
const str7 = "Today's date is 2023-10-27";
const newStr2 = str7.replace(regex7, (match, year, month, day) => {
return `${day}/${month}/${year}`;
});
console.log(newStr2); // ์ถ๋ ฅ: Today's date is 27/10/2023
// split()
const regex8 = /, /;
const str8 = "apple, banana, cherry";
const arr = str8.split(regex8);
console.log(arr); // ์ถ๋ ฅ: ["apple", "banana", "cherry"]
๊ณ ๊ธ ์ ๊ท์ ๊ธฐ์
์บก์ฒ ๊ทธ๋ฃน:
๊ดํธ ()๋ ์ ๊ท ํํ์์์ ์บก์ฒ ๊ทธ๋ฃน์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์บก์ฒ๋ ๊ทธ๋ฃน์ ์ฌ์ฉํ๋ฉด ์ผ์นํ๋ ํ
์คํธ์ ํน์ ๋ถ๋ถ์ ์ถ์ถํ ์ ์์ต๋๋ค. exec() ๋ฐ match() ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์์๊ฐ ์ ์ฒด ์ผ์น ํญ๋ชฉ์ด๊ณ ํ์ ์์๊ฐ ์บก์ฒ๋ ๊ทธ๋ฃน์ธ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
const regex = /(\d{4})-(\d{2})-(\d{2})/;
const dateString = "2023-10-27";
const match = regex.exec(dateString);
console.log(match[0]); // ์ถ๋ ฅ: 2023-10-27 (์ ์ฒด ์ผ์น ํญ๋ชฉ)
console.log(match[1]); // ์ถ๋ ฅ: 2023 (์ฒซ ๋ฒ์งธ ์บก์ฒ๋ ๊ทธ๋ฃน - ์ฐ๋)
console.log(match[2]); // ์ถ๋ ฅ: 10 (๋ ๋ฒ์งธ ์บก์ฒ๋ ๊ทธ๋ฃน - ์)
console.log(match[3]); // ์ถ๋ ฅ: 27 (์ธ ๋ฒ์งธ ์บก์ฒ๋ ๊ทธ๋ฃน - ์ผ)
๋ช ๋ช ๋ ์บก์ฒ ๊ทธ๋ฃน:
ES2018์ (? ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์บก์ฒ ๊ทธ๋ฃน์ ์ด๋ฆ์ ํ ๋นํ ์ ์๋ ๋ช
๋ช
๋ ์บก์ฒ ๊ทธ๋ฃน์ ๋์
ํ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
const regex = /(?\d{4})-(?\d{2})-(?\d{2})/;
const dateString = "2023-10-27";
const match = regex.exec(dateString);
console.log(match.groups.year); // ์ถ๋ ฅ: 2023
console.log(match.groups.month); // ์ถ๋ ฅ: 10
console.log(match.groups.day); // ์ถ๋ ฅ: 27
๋น์บก์ฒ ๊ทธ๋ฃน:
์บก์ฒํ์ง ์๊ณ ์ ๊ท์์ ์ผ๋ถ๋ฅผ ๊ทธ๋ฃนํํด์ผ ํ๋ ๊ฒฝ์ฐ(์: ์๋์๋ฅผ ๊ทธ๋ฃน์ ์ ์ฉํ๊ธฐ ์ํด) (?:...) ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋น์บก์ฒ ๊ทธ๋ฃน์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์บก์ฒ๋ ๊ทธ๋ฃน์ ๋ํ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํผํ ์ ์์ต๋๋ค.
const regex = /(?:https?:\/\/)?([\w\.]+)/; // URL๊ณผ ์ผ์นํ์ง๋ง ๋๋ฉ์ธ ์ด๋ฆ๋ง ์บก์ฒํฉ๋๋ค.
const url = "https://www.example.com/path";
const match = regex.exec(url);
console.log(match[1]); // ์ถ๋ ฅ: www.example.com
Lookarounds:
Lookarounds๋ lookbehind(์) ๋๋ lookahead(๋ค) ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์์ด์ ์์น์ ์ผ์นํ๋ 0 ๋๋น ์ด์ค์ ์ผ๋ก, ์ผ์น ์์ฒด์ lookaround ํจํด์ ํฌํจํ์ง ์์ต๋๋ค.
- ๊ธ์ ์ Lookahead:
(?=...)lookahead ๋ด์ ํจํด์ด ํ์ฌ ์์น๋ฅผ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ ์ผ์นํฉ๋๋ค. - ๋ถ์ ์ Lookahead:
(?!...)lookahead ๋ด์ ํจํด์ด ํ์ฌ ์์น๋ฅผ ๋ฐ๋ฅด์ง ์๋ ๊ฒฝ์ฐ ์ผ์นํฉ๋๋ค. - ๊ธ์ ์ Lookbehind:
(?<=...)lookbehind ๋ด์ ํจํด์ด ํ์ฌ ์์น๋ฅผ ์์๋ ๊ฒฝ์ฐ ์ผ์นํฉ๋๋ค. - ๋ถ์ ์ Lookbehind:
(? lookbehind ๋ด์ ํจํด์ด ํ์ฌ ์์น๋ฅผ ์์์ง ์๋ ๊ฒฝ์ฐ ์ผ์นํฉ๋๋ค.
์:
// ๊ธ์ ์ Lookahead: USD๊ฐ ๋ค์ ์ค๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๊ฒฉ์ ๊ฐ์ ธ์ต๋๋ค.
const regex = /\d+(?= USD)/;
const text = "The price is 100 USD";
const match = text.match(regex);
console.log(match); // ์ถ๋ ฅ: ["100"]
// ๋ถ์ ์ Lookahead: ์ซ์๊ฐ ๋ค์ ์ค์ง ์๋ ๊ฒฝ์ฐ์๋ง ๋จ์ด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
const regex2 = /\b\w+\b(?! \d)/;
const text2 = "apple 123 banana orange 456";
const matches = text2.match(regex2);
console.log(matches); // ์ถ๋ ฅ: null, match()๋ 'g' ํ๋๊ทธ ์์ด ์ฒซ ๋ฒ์งธ ์ผ์น ํญ๋ชฉ๋ง ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํ์ํ ํญ๋ชฉ์ด ์๋๋๋ค.
// ์์ ๋ฐฉ๋ฒ:
const regex3 = /\b\w+\b(?! \d)/g;
const text3 = "apple 123 banana orange 456";
const matches3 = text3.match(regex3);
console.log(matches3); // ์ถ๋ ฅ: [ 'banana' ]
// ๊ธ์ ์ Lookbehind: $๊ฐ ์์ ์ค๋ ๊ฒฝ์ฐ์๋ง ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
const regex4 = /(?<=\$)\d+/;
const text4 = "The price is $200";
const match4 = text4.match(regex4);
console.log(match4); // ์ถ๋ ฅ: ["200"]
// ๋ถ์ ์ Lookbehind: 'not'์ด๋ผ๋ ๋จ์ด๊ฐ ์์ ์ค์ง ์๋ ๊ฒฝ์ฐ์๋ง ๋จ์ด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
const regex5 = /(?
Backreferences:
Backreferences๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ผํ ์ ๊ท ํํ์ ๋ด์์ ์ด์ ์ ์บก์ฒํ ๊ทธ๋ฃน์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ๊ตฌ๋ฌธ \1, \2 ๋ฑ์ ์ฌ์ฉํ๋ฉฐ, ์ฌ๊ธฐ์ ์ซ์๋ ์บก์ฒ๋ ๊ทธ๋ฃน ๋ฒํธ์ ํด๋นํฉ๋๋ค.
const regex = /([a-z]+) \1/;
const text = "hello hello world";
const match = regex.exec(text);
console.log(match); // ์ถ๋ ฅ: ["hello hello", "hello", index: 0, input: "hello hello world", groups: undefined]
์ ๊ท ํํ์์ ์ค์ ์ ์ฉ
์ด๋ฉ์ผ ์ฃผ์ ์ ํจ์ฑ ๊ฒ์ฌ:
์ ๊ท ํํ์์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ด๋ฉ์ผ ์ฃผ์ ์ ํจ์ฑ ๊ฒ์ฌ์ ๋๋ค. ์๋ฒฝํ ์ด๋ฉ์ผ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๊ท์์ ๋งค์ฐ ๋ณต์กํ์ง๋ง ๊ฐ๋จํ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;
console.log(emailRegex.test("test@example.com")); // ์ถ๋ ฅ: true
console.log(emailRegex.test("invalid-email")); // ์ถ๋ ฅ: false
console.log(emailRegex.test("test@sub.example.co.uk")); // ์ถ๋ ฅ: true
ํ ์คํธ์์ URL ์ถ์ถ:
์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ํ ์คํธ ๋ธ๋ก์์ URL์ ์ถ์ถํ ์ ์์ต๋๋ค.
const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*) /g;
const text = "Visit our website at https://www.example.com or check out http://blog.example.org.";
const urls = text.match(urlRegex);
console.log(urls); // ์ถ๋ ฅ: ["https://www.example.com", "http://blog.example.org"]
CSV ๋ฐ์ดํฐ ๊ตฌ๋ฌธ ๋ถ์:
์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ CSV(์ผํ๋ก ๊ตฌ๋ถ๋ ๊ฐ) ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ต๋๋ค. ๋ค์์ CSV ๋ฌธ์์ด์ ๊ฐ ๋ฐฐ์ด๋ก ๋ถํ ํ๊ณ ์ธ์ฉ๋ ํ๋๋ฅผ ์ฒ๋ฆฌํ๋ ์์ ๋๋ค.
const csvString = 'John,Doe,"123, Main St",New York';
const csvRegex = /(?:"([^"]*(?:""[^"]*)*)")|([^,]+)/g; //์์ ๋ CSV ์ ๊ท์
let values = [];
let match;
while (match = csvRegex.exec(csvString)) {
values.push(match[1] ? match[1].replace(/""/g, '"') : match[2]);
}
console.log(values); // ์ถ๋ ฅ: ["John", "Doe", "123, Main St", "New York"]
๊ตญ์ ์ ํ ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
๋ค์ํ ํ์๊ณผ ๊ธธ์ด๋ก ์ธํด ๊ตญ์ ์ ํ ๋ฒํธ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๊ฒ์ ๋ณต์กํฉ๋๋ค. ๊ฐ๋ ฅํ ์๋ฃจ์ ์๋ ์ข ์ข ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ด ํฌํจ๋์ง๋ง ๋จ์ํ๋ ์ ๊ท์์ ํตํด ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
const phoneRegex = /^\+(?:[0-9] ?){6,14}[0-9]$/;
console.log(phoneRegex.test("+1 555 123 4567")); // ์ถ๋ ฅ: true (๋ฏธ๊ตญ ์์ )
console.log(phoneRegex.test("+44 20 7946 0500")); // ์ถ๋ ฅ: true (์๊ตญ ์์ )
console.log(phoneRegex.test("+81 3 3224 5000")); // ์ถ๋ ฅ: true (์ผ๋ณธ ์์ )
console.log(phoneRegex.test("123-456-7890")); // ์ถ๋ ฅ: false
๋น๋ฐ๋ฒํธ ๊ฐ๋ ์ ํจ์ฑ ๊ฒ์ฌ
์ ๊ท ํํ์์ ๋น๋ฐ๋ฒํธ ๊ฐ๋ ์ ์ฑ ์ ์ ์ฉํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์๋ ์์ ์์๋ ์ต์ ๊ธธ์ด, ๋๋ฌธ์, ์๋ฌธ์ ๋ฐ ์ซ์๋ฅผ ํ์ธํฉ๋๋ค.
const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/;
console.log(passwordRegex.test("P@ssword123")); // ์ถ๋ ฅ: true
console.log(passwordRegex.test("password")); // ์ถ๋ ฅ: false (๋๋ฌธ์ ๋๋ ์ซ์ ์์)
console.log(passwordRegex.test("Password")); // ์ถ๋ ฅ: false (์ซ์ ์์)
console.log(passwordRegex.test("Pass123")); // ์ถ๋ ฅ: false (์๋ฌธ์ ์์)
console.log(passwordRegex.test("P@ss1")); // ์ถ๋ ฅ: false (8์ ๋ฏธ๋ง)
์ ๊ท์ ์ต์ ํ ๊ธฐ์
์ ๊ท ํํ์์ ํนํ ๋ณต์กํ ํจํด์ด๋ ํฐ ์ ๋ ฅ์ ๊ฒฝ์ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ๋ค์์ ์ ๊ท์ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ธฐ์ ์ ๋๋ค.
- ๊ตฌ์ฒด์ ์ผ๋ก ์์ฑ: ์๋ํ ๊ฒ๋ณด๋ค ๋ ๋ง์ด ์ผ์นํ ์ ์๋ ๊ณผ๋ํ๊ฒ ์ผ๋ฐ์ ์ธ ํจํด์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
- ์ต์ปค ์ฌ์ฉ: ๊ฐ๋ฅํ๋ฉด ์ธ์ ๋ ์ง ๋ฌธ์์ด์ ์์ ๋๋ ๋์ ์ ๊ท์์ ๊ณ ์ ํฉ๋๋ค(
^,$). - Backtracking ๋ฐฉ์ง: possessive ์๋์(์:
+๋์++) ๋๋ atomic ๊ทธ๋ฃน((?>...))์ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ฌ backtracking์ ์ต์ํํฉ๋๋ค. - ํ ๋ฒ ์ปดํ์ผ: ๋์ผํ ์ ๊ท์์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ ๋ฒ ์ปดํ์ผํ๊ณ
RegExp๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค. - ๋ฌธ์ ํด๋์ค๋ฅผ ํ๋ช
ํ๊ฒ ์ฌ์ฉ: ๋ฌธ์ ํด๋์ค(
[])๋ ์ผ๋ฐ์ ์ผ๋ก alternation(|)๋ณด๋ค ๋น ๋ฆ ๋๋ค. - ๊ฐ๋จํ๊ฒ ์ ์ง: ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ด ๊ณผ๋ํ๊ฒ ๋ณต์กํ ์ ๊ท์์ ํผํ์ญ์์ค. ๋๋ก๋ ๋ณต์กํ ์์ ์ ์ฌ๋ฌ ๊ฐ์ ๋ ๊ฐ๋จํ ์ ๊ท์์ผ๋ก ๋ถํดํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฌธ์์ด ์กฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ ๊ท์ ์ค์
- ๋ฉํ ๋ฌธ์ ์ด์ค์ผ์ดํ๋ฅผ ์์ด๋ฒ๋ฆฌ๋ ๊ฒ:
.,*,+,?,$,^,(,),[,],{,},|๋ฐ\์ ๊ฐ์ ํน์ ๋ฌธ์๋ฅผ ๋ฆฌํฐ๋ด๋ก ์ผ์น์ํค๋ ค๋ ๊ฒฝ์ฐ ์ด์ค์ผ์ดํํ์ง ๋ชปํฉ๋๋ค. .(์ )์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ: ์ ์ ๋ชจ๋ ๋ฌธ์(์ผ๋ถ ๋ชจ๋์์๋ ์ค ๋ฐ๊ฟ ์ ์ธ)์ ์ผ์นํ๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์๊ธฐ์น ์์ ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฌธ์ ํด๋์ค ๋๋ ๋ค๋ฅธ ๋ ์ ํ์ ์ธ ํจํด์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ ํ ๊ตฌ์ฒด์ ์ผ๋ก ์์ฑํ์ญ์์ค.- Greediness: ๊ธฐ๋ณธ์ ์ผ๋ก
*๋ฐ+์ ๊ฐ์ ์๋์๋ ํ์์ ์ด๋ฉฐ ๊ฐ๋ฅํ ํ ๋ง์ด ์ผ์นํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ฅ ์งง์ ๋ฌธ์์ด์ ์ผ์น์์ผ์ผ ํ๋ ๊ฒฝ์ฐ lazy ์๋์(*?,+?)๋ฅผ ์ฌ์ฉํ์ญ์์ค. - ์ต์ปค๋ฅผ ์๋ชป ์ฌ์ฉํ๋ ๊ฒ:
^(๋ฌธ์์ด/์ค์ ์์) ๋ฐ$(๋ฌธ์์ด/์ค์ ๋)์ ๋์์ ์คํดํ๋ฉด ์๋ชป๋ ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ค ๋ฌธ์์ด๋ก ์์ ํ๊ณ^๋ฐ$๊ฐ ๊ฐ ์ค์ ์์๊ณผ ๋์ ์ผ์นํ๋๋ก ํ๋ ค๋ฉดm(์ฌ๋ฌ ์ค) ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. - Edge ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ๊ฒ: ๊ฐ๋ฅํ ๋ชจ๋ ์ ๋ ฅ ์๋๋ฆฌ์ค์ edge ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํ์ง ๋ชปํ๋ฉด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋น ๋ฌธ์์ด, ์๋ชป๋ ๋ฌธ์ ๋ฐ ๊ฒฝ๊ณ ์กฐ๊ฑด์ ํฌํจํ์ฌ ๋ค์ํ ์ ๋ ฅ์ผ๋ก ์ ๊ท์์ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
- ์ฑ๋ฅ ๋ฌธ์ : ๊ณผ๋ํ๊ฒ ๋ณต์กํ๊ณ ๋นํจ์จ์ ์ธ ์ ๊ท์์ ๊ตฌ์ฑํ๋ฉด ํนํ ํฐ ์ ๋ ฅ์ผ๋ก ์ธํด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ ๊ตฌ์ฒด์ ์ธ ํจํด์ ์ฌ์ฉํ๊ณ ๋ถํ์ํ backtracking์ ํผํ๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ๊ท์์ ์ปดํ์ผํ์ฌ ์ ๊ท์์ ์ต์ ํํ์ญ์์ค.
- ๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฌด์: ๋ฌธ์ ์ธ์ฝ๋ฉ(ํนํ ์ ๋์ฝ๋)์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉด ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ๋์ฝ๋ ๋ฌธ์๋ก ์์
ํ ๋
uํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฐ๋ฅธ ์ผ์น๋ฅผ ํ์ธํ์ญ์์ค.
๊ฒฐ๋ก
์ ๊ท ํํ์์ JavaScript์์ ํจํด ๋งค์นญ ๋ฐ ํ ์คํธ ์กฐ์์ ์ํ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ์ ๊ท์ ๊ตฌ๋ฌธ๊ณผ ๊ธฐ์ ์ ๋ง์คํฐํ๋ฉด ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ์์ ๋ณต์กํ ํ ์คํธ ์ฒ๋ฆฌ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์ ๋ ผ์๋ ๊ฐ๋ ์ ์ดํดํ๊ณ ์ค์ ์์ ๋ก ์ฐ์ตํ๋ฉด ์ ๊ท ํํ์ ์ฌ์ฉ์ ๋ฅ์ํด์ ธ์ JavaScript ๊ฐ๋ฐ ๊ธฐ์ ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ ๊ท ํํ์์ ๋ณต์กํ ์ ์์ผ๋ฉฐ regex101.com ๋๋ regexr.com๊ณผ ๊ฐ์ ์จ๋ผ์ธ ์ ๊ท์ ํ ์คํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ ์ ํ ํ ์คํธํ๋ ๊ฒ์ด ์ข ์ข ๋์์ด ๋๋ค๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผ์น ํญ๋ชฉ์ ์๊ฐํํ๊ณ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋๋ฒ๊ทธํ ์ ์์ต๋๋ค. ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์!