[JS] ์๋ฐ์คํฌ๋ฆฝํธ ์ ๊ท์์ผ๋ก ์ฒ ๋จ์ ๊ตฌ๋ถ์ ์ถ๊ฐํ๊ธฐ (๋จ์ด ๊ฒฝ๊ณ, ์ ํ๋ฐฉํ์)
ํฐ ์ซ์๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ฒ ๋จ์๋ง๋ค ์ฝค๋ง(,
)๊ฐ์ ๊ตฌ๋ถ์๋ฅผ ์ถ๊ฐํ๋ค. ์ฒ ๋จ์ ๊ตฌ๋ถ์ ํ๊ตญ์ ํฌํจํ ๋ง์ ๊ตญ๊ฐ์์ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ ์ซ์ ํ๊ธฐ๋ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ Number.toLocaleString()
ํน์ Intl.NumberFormat
๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๊ตฌ๋ถ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ์ฐธ๊ณ ๋ก ์ด ๋ฉ์๋๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ ํ๊ฒฝ์ ๋ก์ผ์ผ ์ค์ ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ๋
์ผ ๋ก์ผ์ผ(de-DE)์ ์ฒ ๋จ์ ๊ตฌ๋ถ์๋ก ์จ์ (.
)์ ์ฌ์ฉํ๊ณ , ์์์ ๊ตฌ๋ถ์๋ก ์ฝค๋ง(,
)๋ฅผ ์ฌ์ฉํ๋ค. — ์ฐธ๊ณ ํฌ์คํ
const number = 123456.789;
// ๋ก์ผ์ผ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๋ก์ผ์ผ(navigator.language)์ ๋ฐ๋ฅธ๋ค
Intl.NumberFormat().format(number); // '123,456.789'
// ๋ฏธ๊ตญ, ํ๊ตญ ๋ฑ์ ๋๋ผ๋ ์ฒ ๋จ์ ๊ตฌ๋ถ์๋ก ์ฝค๋ง(,)๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ๊ตฌ๋ถ์๋ก ์ (.)์ ์ฌ์ฉํ๋ค
Intl.NumberFormat("ko-KR").format(number); // '123,456.789'
// ๋
์ผ์ ์ฒ ๋จ์ ๊ตฌ๋ถ์๋ก ์ (.)์ ์ฌ์ฉํ๊ณ ์์์ ๊ตฌ๋ถ์๋ก ์ฝค๋ง(,)๋ฅผ ์ฌ์ฉํ๋ค
Intl.NumberFormat("de-DE").format(number); // '123.456,789'
// ๋ก์ผ์ผ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๋ก์ผ์ผ(navigator.language)์ ๋ฐ๋ฅธ๋ค
number.toLocaleString(); // '123,456.789'
// ๋ฏธ๊ตญ, ํ๊ตญ ๋ฑ์ ๋๋ผ๋ ์ฒ ๋จ์ ๊ตฌ๋ถ์๋ก ์ฝค๋ง(,)๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ๊ตฌ๋ถ์๋ก ์ (.)์ ์ฌ์ฉํ๋ค
number.toLocaleString("ko-KR"); // '123,456.789'
// ๋
์ผ์ ์ฒ ๋จ์ ๊ตฌ๋ถ์๋ก ์ (.)์ ์ฌ์ฉํ๊ณ ์์์ ๊ตฌ๋ถ์๋ก ์ฝค๋ง(,)๋ฅผ ์ฌ์ฉํ๋ค
number.toLocaleString("de-DE"); // '123.456,789'
ํํธ, ์ ๊ท์์ ์ด์ฉํด์ ์ฒ ๋จ์ ๊ตฌ๋ถ์๋ฅผ ์ถ๊ฐํ ์๋ ์๋๋ฐ, ๋์ ๋ฐฉ์์ ์ดํดํ๋ ค๋ฉด ๋จ์ด ๊ฒฝ๊ณ, ์ ๋ฐฉ ํ์, ๋ถ์ ์ ๋ฐฉ ํ์ ๋ฑ์ ๊ฐ๋ ์ ์๊ณ ์์ด์ผ ํ๋ค. ์๋ ๋ด์ฉ์ ํตํด ์์ธํ ์์๋ณด์.
'1234567'.replace(/\B(?=(\d{3})+(?!\d))/g, ","); // '1,234,567'
\B
: ๋จ์ด ๊ฒฝ๊ณ๊ฐ ์๋ ์์น(?=...)
: ์ ๋ฐฉ ํ์(\d{3})+
: 3๊ฐ์ ์ซ์๋ก ์ด๋ค์ง ๊ทธ๋ฃน์ด ํ ๋ฒ ์ด์ ๋ฐ๋ณต(?!...)
: ๋ถ์ ์ ๋ฐฉ ํ์
๋จ์ด ๊ฒฝ๊ณ | Word Boundaries
๐ก ์ฐธ๊ณ ๋ด์ฉ
\w
๋จ์ด ๋ฌธ์ : ์ํ๋ฒณ ๋์๋ฌธ์, ์ซ์, ์ธ๋์ค์ฝ์ด(_
)\W
๋น๋จ์ด ๋ฌธ์ : ๋จ์ด ๋ฌธ์๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์ (์จ์ , ์ฝค๋ง, ๊ณต๋ฐฑ ๋ฑ)
\b
๋ฉํ ๋ฌธ์๋ ๋จ์ด ๊ฒฝ๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ๋จ์ด ๋ฌธ์(\w
)์ ๋น๋จ์ด ๋ฌธ์(\W
) ์ฌ์ด์ ์์น๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฆ, ๋จ์ด์ ์์์ด๋ ๋์ ๋ํ๋ธ๋ค(์/๋ค์ ๋ค๋ฅธ ๋จ์ด ๋ฌธ์๊ฐ ์๋ ์์น). ์๋ฅผ ๋ค์ด hello world.
๋ฌธ์์ด์ ๋จ์ด ๊ฒฝ๊ณ๋ ์๋์ ๊ฐ๋ค(์์ง์ |
์ผ๋ก ํ๊ธฐํ ๊ณณ).
์๋ ์์์ ์ ๊ท์์ \b
๋ฉํ ๋ฌธ์๋ฅผ ์ด์ฉํด cat
์/๋ค์ ๋ค๋ฅธ ๋จ์ด ๋ฌธ์๊ฐ ์๋ ์์น๋ฅผ ์ฐพ๊ณ ์๋ค.
const reg = /\bcat\b/;
// cat ์/๋ค์ ๋จ์ด ๋ฌธ์๊ฐ ์์ผ๋ฏ๋ก ๋งค์นญ
"I have a cat.".match(reg); // ['cat', index: 9, ...]
// cat ๋ค์ ๋จ์ด ๋ฌธ์๊ฐ ์์ผ๋ฏ๋ก ๋งค์นญ ์๋จ
"The catalog is here.".match(reg); // null
์ฒซ ๋ฒ์งธ ๋ฌธ์ฅ I have a cat.
์์ cat
๋ค์ ์จ์ (.
)์ด ์์ง๋ง, ์จ์ ์ ๋จ์ด ๋ฌธ์๊ฐ ์๋๋ฏ๋ก ๋จ์ด ๊ฒฝ๊ณ๋ก ๊ฐ์ฃผํ๋ค. ๋ ๋ฒ์งธ ๋ฌธ์ฅ์ catalog
๋ cat
๋ค์ ๋จ์ด ๋ฌธ์ a
๊ฐ ์์ผ๋ฏ๋ก ๋งค์นญ๋์ง ์๋๋ค.
๋ฐ๋๋ก \B
๋ฉํ ๋ฌธ์๋ ๋น๋จ์ด ๊ฒฝ๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ๋จ์ด ๊ฒฝ๊ณ๊ฐ ์๋ ์์น๋ฅผ ์ฐพ๋๋ค. \b
๋จ์ด ๊ฒฝ๊ณ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ์ ์ธํ ๋๋จธ์ง ๋ถ๋ถ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ์๋ ์์น๋ฅผ ๋ชจ๋ ํฌํจํ๋ค.
- ๋ ๋จ์ด ๋ฌธ์ ์ฌ์ด
- ๋ ๋น๋จ์ด ๋ฌธ์ ์ฌ์ด
- ๋น๋จ์ด ๋ฌธ์์ ๋ฌธ์์ด ์์/๋ ์ฌ์ด
hello world.
๋ฌธ์์ด์์ ๋จ์ด ๊ฒฝ๊ณ๊ฐ ์๋ ๊ณณ์ ์๋์ ๊ฐ๋ค(์์ง์ |
์ผ๋ก ํ๊ธฐํ ๊ณณ).
์๋ ์์์ ์ ๊ท์์ \B
๋ฉํ ๋ฌธ์๋ฅผ ์ด์ฉํด cat
์/๋ค์ ๋ค๋ฅธ ๋จ์ด ๋ฌธ์๊ฐ ์๋ ์์น๋ฅผ ์ฐพ๊ณ ์๋ค.
const reg = /\Bcat\B/;
// cat ์/๋ค ๋ชจ๋ ๋น๋จ์ด ๊ฒฝ๊ณ๊ฐ ์๋๋ฏ๋ก(๋จ์ด ๊ฒฝ๊ณ์ด๋ฏ๋ก) ๋งค์นญ ์๋จ
"I have a cat.".match(reg); // null
// cat ์์ด ๋น๋จ์ด ๊ฒฝ๊ณ๊ฐ ์๋๋ฏ๋ก(๋จ์ด ๊ฒฝ๊ณ์ด๋ฏ๋ก) ๋งค์นญ ์๋จ
"The catalog is here.".match(reg); // null
// cat ์/๋ค ๋ชจ๋ ๋น๋จ์ด ๊ฒฝ๊ณ์ด๋ฏ๋ก(๋จ์ด ๊ฒฝ๊ณ๊ฐ ์๋๋ฏ๋ก) ๋งค์นญ
"I have a concatenate.".match(reg); // ['cat', index: 12, ...]
์ ํ๋ฐฉํ์ | Lookaround
์ ํ๋ฐฉํ์์ ํน์ ํจํด ์ ํน์ ๋ค์ ์๋ ํ ์คํธ๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉํ๋ค. ์ ํ๋ฐฉํ์ ๊ตฌ๋ฌธ์์ ๊ดํธ์ ํฌํจ๋ ์์ ๊ฒฐ๊ณผ์ ํฌํจ๋์ง ์๋ ์ ์ ์ฃผ์ํ์(๋งค์นญ ๊ฒฐ๊ณผ์ ํฌํจ ์๋จ).
์ ๋ฐฉ ํ์ | Lookahead
$x(?=y)$
์ ๋ฐฉ ํ์์ y
(ํจํด)๊ฐ ๋ค์ ์ค๋ x
๋ฅผ ์ฐพ๋๋ค. ์ฆ, x
๋ค์ y
๊ฐ ์ค๋ ๊ฒฝ์ฐ์๋ง x
์ ๋งค์นญํ๋ค. ์ฌ๊ธฐ์ ์ ๊ท์ ์์ง์ x
๋ฅผ ๋จผ์ ์ฐพ์ ํ, x
๋ฐ๋ก ๋ค์ y
ํจํด๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ค.
์๋ ์์์์ 1ํ ์ด์ ๋ฐ๋ณต๋๋ ์ซ์(\d+
)๋ฅผ ์ฐพ์ ํ, ์ซ์ ๋ฐ๋ก ๋ค์ €
๊ธฐํธ๊ฐ ์๋์ง ํ์ธํ๋ค. €
๊ธฐํธ๊ฐ ์๋ค๋ฉด ํจํด๊ณผ ์ผ์นํ๋ฏ๋ก ํด๋น ์ซ์๊ฐ ๋งค์นญ ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค.
// ์ ๋ฐฉ ํ์์ ์ด์ฉํ์ฌ € ๊ธฐํธ๊ฐ ๋ค์ ์๋ 1์๋ฆฌ ์ด์์ ์ซ์๋ฅผ ์ฐพ๋ ์์
const str = "1 turkey costs 30€";
str.match(/\d+(?=€)/); // ['30', index: 15, ...]
x(?=y)(?=z)
์ฒ๋ผ ์ ๋ฐฉ ํ์์ ์ฐ์ํด์ ์ฌ์ฉํ ์๋ ์๋๋ฐ, ์ด๋ x
๋ค์ y
,z
๊ฐ ๋์์ ๋ํ๋๋ ๊ฒฝ์ฐ์๋ง ๋งค์นญํ๋ค. ์๋ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
x
๋ฅผ ์ฐพ๋๋ค.x
๋ฐ๋ก ๋ค์y
๊ฐ ์๋์ง ์ฐพ๋๋ค.x
๋ฐ๋ก ๋ค์z
๊ฐ ์๋์ง ์ฐพ๋๋ค.- 2~3๋ฒ ํ
์คํธ๋ฅผ ๋ชจ๋ ํต๊ณผํ๋ฉด
x
๊ฐ ๋งค์นญ๋๋ค.
์๋ ์์์์ 1ํ ์ด์ ๋ฐ๋ณต๋๋ ์ซ์ ๋ค์ ๊ณต๋ฐฑ์ด ์๊ณ , ๊ทธ ์ดํ ์ด๋๊ฐ์ 30์ด ์๋ ๊ฒฝ์ฐ ๋งค์นญ๋๋ค.
const str = "1 turkey costs 30€";
str.match(/\d+(?=\s)(?=.*30)/); // ['1', index: 0, ...]
- ์ฒซ ๋ฒ์งธ ์ ๋ฐฉ ํ์ :
\d+
๋ค์ ๊ณต๋ฐฑ(\s
)์ด ์๋์ง ํ์ธ - ๋ ๋ฒ์งธ ์ ๋ฐฉ ํ์ :
\d+
๋ค์ ์์ ๋ฌธ์(.
)๊ฐ 0๋ฒ ์ด์ ๋ฐ๋ณต(*
)๋ ํ 30์ด ์๋์ง ํ์ธ
๋ถ์ ์ ๋ฐฉ ํ์ | Negative lookahead
$x(?!y)$
๋ถ์ ์ ๋ฐฉ ํ์์ y
(ํจํด)๊ฐ ๋ค์ ์ค์ง ์๋ x
๋ฅผ ์ฐพ๋๋ค. ์ฆ, x
๋ค์ y
๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง x
์ ๋งค์นญํ๋ค. ์๋ ์์์์ €
๊ธฐํธ๊ฐ ๋ค์ ๋ํ๋์ง ์๋ 1ํ ์ด์ ๋ฐ๋ณต๋๋ ์ซ์์ ๋งค์นญํ๋ค.
const str = "2 turkey costs 60€";
str.match(/\d+(?!€)/); // ['2', index: 0, ...]
ํ๋ฐฉ ํ์ | Lookbehind
์ ๋ฐฉ ํ์์ด '๋ค์์ ์ค๋ ๊ฒ'์ ๋ํ ์กฐ๊ฑด์ด์๋ค๋ฉด, ํ๋ฐฉ ํ์์ '์ด์ ์ ์จ ๊ฒ'์ ๋ํ ์กฐ๊ฑด์ด๋ค.
- ํ๋ฐฉ ํ์ :
(?<=y)x
—x
์์y
๊ฐ ์๋ ๊ฒฝ์ฐ์๋งx
์ ๋งค์นญ - ๋ถ์ ํ๋ฐฉ ํ์ :
(?<!y)x
—x
์์y
๊ฐ ์๋ ๊ฒฝ์ฐ์๋งx
์ ๋งค์นญ
const str = "2 turkey costs $30";
// ํ๋ฐฉ ํ์์ ์ด์ฉํด ๋ฌ๋ฌ ๊ธฐํธ($)๊ฐ ์์ ์๋ ์ซ์์ ๋งค์นญ (๊ธ์ก ์ฐพ๊ธฐ)
str.match(/(?<=\$)\d+/); // ['30', index: 16, ...]
// ๋ถ์ ํ๋ฐฉ ํ์์ ์ด์ฉํด ๋ฌ๋ฌ ๊ธฐํธ($)๊ฐ ์์ ์๋ ์ซ์์ ๋งค์นญ (์๋ ์ฐพ๊ธฐ)
str.match(/(?<!\$)\d+/); // ['2', index: 0, ...]
์ฒ ๋จ์ ๊ตฌ๋ถ์ ์ ๊ท์ ๋ถ์
์ด์ ์ ์ ๊ท์์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์์๋ณด์. x(?=y)
์ ๋ฐฉ ํ์์ y
ํจํด์ด ๋ค์ ์ค๋ x
๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์ ๋น๋จ์ด ๊ฒฝ๊ณ \B
์์น๋ฅผ ์ฐพ๋ ๊ฒ์ผ๋ก ์์ํ๋ค. ๊ทธ ํ ๋ฌธ์์ด ์ผ์ชฝ์ ์๋ ๋น๋จ์ด ๊ฒฝ๊ณ๋ถํฐ 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน์ด 1ํ ์ด์ ๋ฐ๋ณต๋๋์ง ํ์ธํ๋ค.
โถ 1234567
์ ๋น๋จ์ด ๊ฒฝ๊ณ(\B
)๋ฅผ ์ฐพ๋๋ค(์์ง์ |
์ผ๋ก ํ๊ธฐํ ๊ณณ).
โท ๋น๋จ์ด ๊ฒฝ๊ณ ๋ฐ๋ก ๋ค๋ถํฐ 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน์ด 1ํ ์ด์ ๋ฐ๋ณต๋๋์ง ํ์ธํ๋ค. ...(?!\d)
๋ถ์ ์ ๋ฐฉ ํ์์ ๋ค์ ์ซ์๊ฐ ์๋ ์์น๋ฅผ ์๋ฏธํ๋ฏ๋ก, ์ ํํ 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน์ด ๋ฌธ์์ด ๋ง์ง๋ง๊น์ง ๋ฐ๋ณต๋ผ์ผ๋ง ๋งค์นญ๋๋ค.
- 1๋ฒ์งธ ๋น๋จ์ด ๊ฒฝ๊ณ(1๊ณผ 2 ์ฌ์ด) 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน : {234}, {567} — โ
- 2๋ฒ์งธ ๋น๋จ์ด ๊ฒฝ๊ณ(2์ 3 ์ฌ์ด) 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน : {345}, {67} — โ
- 3๋ฒ์งธ ๋น๋จ์ด ๊ฒฝ๊ณ(3๊ณผ 4 ์ฌ์ด) 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน : {456}, {7} — โ
- 4๋ฒ์งธ ๋น๋จ์ด ๊ฒฝ๊ณ(4์ 5 ์ฌ์ด) 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน : {567} — โ
- 5๋ฒ์งธ ๋น๋จ์ด ๊ฒฝ๊ณ(5์ 6 ์ฌ์ด) 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน : {67} — โ
- 6๋ฒ์งธ ๋น๋จ์ด ๊ฒฝ๊ณ(6๊ณผ 7 ์ฌ์ด) 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน : {7} — โ
โธ ๋งค์นญ๋๋ ๋น๋จ์ด ๊ฒฝ๊ณ ์์น(1, 4๋ฒ์งธ)์ ์ฝค๋ง(,
)๋ก ๊ต์ฒด(์ถ๊ฐ)ํ๋ค.
๋ง์ฝ ...(?!\d)
๋ถ์ ์ ๋ฐฉ ํ์์ ์ ๊ฑฐํ๋ค๋ฉด? ์ ๊ท์์ ๋ ์ด์ ์ซ์์ ๋์ ํ์ธํ์ง ์๊ธฐ ๋๋ฌธ์ 3์๋ฆฌ ์ซ์ ๊ทธ๋ฃน์ด 1ํ๋ง ๋ฐ๋ณต๋๋ฉด ํญ์ ๋งค์นญ๋๋ค. ๊ทธ๋ผ 4๋ฒ์งธ ๋น๋จ์ด ๊ฒฝ๊ณ๊น์ง ์ฝค๋ง๊ฐ ๋ชจ๋ ์ถ๊ฐ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ฒ์ธ
replacer ํจ์
String.replace(pattern, replacement)
ํจ์์ ๋ ๋ฒ์งธ ์ธ์์ replacer
ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. replacer
ํจ์๋ ๋งค์นญ๋๋ ๋ถ๋ถ์ด ์์ ๋๋ง๋ค ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ๊ต์ฒด ์์
์ ๋ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
function replacer(match, p1, p2, /* ..., */ pN, offset, string, groups) {
// ...
}
- match : ๋งค์นญ๋ ๋ฌธ์์ด
- p1, p2, … : ๊ฐ ์บก์ฒ ๊ทธ๋ฃน์ ํด๋นํ๋ ๋ฌธ์์ด (๊ดํธ๋ก ๊ฐ์ผ ๋ถ๋ถ)
์์)/(a)|(b)/
๊ฐ์ ์ ๊ท์์์(a)
๊ทธ๋ฃน๋ง ๋งค์นญ๋ ๊ฒฝ์ฐ p2๋undefined
- offset : match ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค(์๋ณธ ๋ฌธ์์ด ๊ธฐ์ค)
์์)abcd
๋ฌธ์์ด์์bc
๊ฐ ๋งค์นญ๋๋ค๋ฉด offset์1
- string : ์๋ณธ ๋ฌธ์์ด
- groups : ์ด๋ฆ์ด ์ง์ ๋ ์บก์ฒ ๊ทธ๋ฃน์ ํฌํจํ ๊ฐ์ฒด (ES2018์์ ๋์
, ๋ฏธ์ง์์
undefined
)
์์)/(?<name>a)/
์ ๊ท์์์ groups ๊ฐ์ฒด๋{ name: 'a' }
function replacer(match, p1, p2, p3, offset, string, groups) {
console.log(match); // 2024-07-17
console.log(p1); // 2024
console.log(p2); // 07
console.log(p3); // 17
console.log(offset); // 26 -> ๋งค์นญ๋ ๋ถ๋ถ์ ์์ ์ธ๋ฑ์ค
console.log(string); // The event is scheduled on 2024-07-17.
console.log(groups); // {day: '17'} -> (?<day>\d{2}) ๋ถ๋ถ
return `${p3}/${p2}/${p1}`; // DD/MM/YYYY ํ์์ผ๋ก ๋ณํ
}
const str = 'The event is scheduled on 2024-07-17.';
const regex = /(\d{4})-(\d{2})-(?<day>\d{2})/;
const newStr = str.replace(regex, replacer);
console.log(newStr); // 'The event is scheduled on 17/07/2024.'
match vs matchAll
match
๋ฉ์๋์ g
ํ๋๊ทธ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์บก์ฒ ๊ทธ๋ฃน์ด ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ํฌํจ๋์ง ์๋๋ค. g
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ ๋ ์บก์ฒ ๊ทธ๋ฃน๋ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ํฌํจํ๋ ค๋ฉด matchAll
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
g
ํ๋๊ทธ ์์ดmatch
๋ฉ์๋ ์ฌ์ฉ :[์ต์ด ๋งค์นญ ๊ฒฐ๊ณผ, (์ต์ด ๋งค์นญ์ ์บก์ฒ ๊ทธ๋ฃน)]
g
ํ๋๊ทธ์ ํจ๊ปmatch
๋ฉ์๋ ์ฌ์ฉ :[๋ชจ๋ ๋งค์นญ ๊ฒฐ๊ณผ]
— ์บก์ฒ ๊ทธ๋ฃน ๋ฏธํฌํจmatchAll
๋ฉ์๋ ์ฌ์ฉ(g
ํ๋๊ทธ ํ์) :[๋ชจ๋ ๋งค์นญ ๊ฒฐ๊ณผ, (๊ฐ ๋งค์นญ์ ์บก์ฒ ๊ทธ๋ฃน)]
const str = "hello1 hello2 hello3";
// g ํ๋๊ทธ ์์ด match ๋ฉ์๋ ์ฌ์ฉ
const result1 = str.match(/(hello\d)/);
console.log(result1);
// ["hello1", "hello1"] (์ต์ด ๋งค์นญ ๊ฒฐ๊ณผ, ์ต์ด ๋งค์นญ์ ์บก์ฒ ๊ทธ๋ฃน)
// g ํ๋๊ทธ์ ํจ๊ป match ๋ฉ์๋ ์ฌ์ฉ
const result2 = str.match(/(hello\d)/g);
console.log(result2);
// ["hello1", "hello2", "hello3"] (๋ชจ๋ ๋งค์นญ ๊ฒฐ๊ณผ)
// matchAll ๋ฉ์๋ ์ฌ์ฉ (matchAll์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค)
const result3 = [...str.matchAll(/(hello\d)/g)];
console.log(result3);
/*
[
["hello1", "hello1", index: 0, ...], (์ฒซ๋ฒ์งธ ๋งค์นญ ๊ฒฐ๊ณผ, ์ฒซ๋ฒ์งธ ๋งค์นญ์ ์บก์ฒ ๊ทธ๋ฃน)
["hello2", "hello2", index: 7, ...], (๋๋ฒ์งธ ๋งค์นญ ๊ฒฐ๊ณผ, ๋๋ฒ์งธ ๋งค์นญ์ ์บก์ฒ ๊ทธ๋ฃน)
["hello3", "hello3", index: 14, ...] (์ธ๋ฒ์งธ ๋งค์นญ ๊ฒฐ๊ณผ, ์ธ๋ฒ์งธ ๋งค์นญ์ ์บก์ฒ ๊ทธ๋ฃน)
]
*/
๋ ํผ๋ฐ์ค
- Lookahead and lookbehind | JavaScript Info
- What are non-word boundary in regex (\B), compared to word-boundary?
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Algorithm] ํ๋ก๊ทธ๋๋จธ์ค - ํผ๋ก๋ / ๋ฐฑํธ๋ํน์ผ๋ก ๋ชจ๋ ๋ถ๋ถ์งํฉ ์ฐพ๊ธฐ
[Algorithm] ํ๋ก๊ทธ๋๋จธ์ค - ํผ๋ก๋ / ๋ฐฑํธ๋ํน์ผ๋ก ๋ชจ๋ ๋ถ๋ถ์งํฉ ์ฐพ๊ธฐ
2024.07.29 -
[DevTools] ๋ฆฌ์กํธ ํ ์คํธ ํ๊ฒฝ(Vitest, React Testing Library) ๋ฐ CI ๊ตฌ์ถ
[DevTools] ๋ฆฌ์กํธ ํ ์คํธ ํ๊ฒฝ(Vitest, React Testing Library) ๋ฐ CI ๊ตฌ์ถ
2024.07.22 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ reduce() ๋ฉ์๋ ํ์ฉ ์์ ๋ชจ์
[JS] ์๋ฐ์คํฌ๋ฆฝํธ reduce() ๋ฉ์๋ ํ์ฉ ์์ ๋ชจ์
2024.07.07 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ Set ๊ฐ์ฒด์ ์งํฉ ์ฐ์ฐ ๋ฉ์๋ (๊ต์งํฉ, ํฉ์งํฉ ๋ฑ)
[JS] ์๋ฐ์คํฌ๋ฆฝํธ Set ๊ฐ์ฒด์ ์งํฉ ์ฐ์ฐ ๋ฉ์๋ (๊ต์งํฉ, ํฉ์งํฉ ๋ฑ)
2024.07.04