[JS] ๋ฌธ์ฅ, ๋จ์ด, ์์๋ณ๋ก ๋ฌธ์์ด ๋ถ๋ฆฌํ๊ธฐ
split() ๋ฉ์๋์ ๋ฌธ์ ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฌธ์์ด์ ๋ถ๋ฆฌํ ๋ ์ผ๋ฐ์ ์ผ๋ก split()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง ์๋์ฒ๋ผ ๊ตฌ๋ถ์๋ ๊ฒฐ๊ณผ ๋ฐฐ์ด์์ ์ ์ธ๋๊ณ ๋ถํ์ํ ๊ณต๋ฐฑ์ด ์ถ๊ฐ๋๋ค. ์ฆ, language-sensitive ํ์ง ์๋ ๋จ์ ์ด ์๋ค. language-sensitive๋ ๋ฌธ๋งฅ์ ๋ง๋ ํํ๊ณผ ์ฉ์ด ์ฌ์ฉ์ ์๋ฏธํ๋ค. ํ๊ตญ์ด๋ก๋ ์ธ์ด ๊ฐ์์ฑ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
'Hello! How are you?'.split(/[.!?]/);
// ['Hello', ' How are you', '']
๐ก ์ ๊ท์ ๊ด๋ จ ์ฐธ๊ณ
- ํํ์์ ํ๋์ ๋จ์๋ก ์ทจ๊ธํ๋ ํฌํ ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌ๋ถ์๋ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ํฌํจํ ์ ์๋ค
[]
๋ฌธ์ ๊ทธ๋ฃน์ ๋๊ดํธ ๋ด๋ถ ๋ฌธ์์ด ์ค ํ๋๋ผ๋ ์ผ์นํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค
Intl
์๋ฐ์คํฌ๋ฆฝํธ API๋ฅผ ํ์ฉํ๋ฉด ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
Intl.Segmenter
Intl.Segmenter
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด์ ์๋ฏธ์๋ ๋จ์๋ก ๋ถ๋ฆฌํ ์ ์๋ค. locale
, granularity
๋ฅผ ์ ์ํ ํ segment
๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ๋ถ๋ฆฌํ๊ณ ์ถ์ ๋ฌธ์์ด์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
๐ก granularity ์ต์ (้ข็ฒ้้กน) ์ข ๋ฅ
- sentence: ๋ฌธ์ฅ ๋จ์๋ก ๋ถ๋ฆฌ
- word: ๋จ์ด ๋จ์๋ก ๋ถ๋ฆฌ
- grapheme: ๋ฌธ์์(์๋ฏธ๋ฅผ ๋ํ๋ด๋ ์ต์ ๋จ์) ๋จ์๋ก ๋ถ๋ฆฌ
segment
๋ฉ์๋๋ ์ ์ํ locale
, granularity
์ต์
์ ๋ฐ๋ผ ๋ฌธ์์ด์ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ํ๋ด๋ Segments ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค. Segments ์ธ์คํด์ค๋ ์ดํฐ๋ฌ๋ธ์ด๋ค. ๋ฐ๋ผ์ ์ ๊ฐ์ฐ์ฐ์
, Array.from
, for of
๋ฌธ ๋ฑ์์ ์ฌ์ฉํ ์ ์๋ค.
granularity: 'word'
์ผ ๋ โผ
const segmenterKo = new Intl.Segmenter('ko', { granularity: 'word' });
const segmentsKo = segmenterKo.segment('์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค');
console.log([...segmentsKo]);
/*
{ segment: '์๋
ํ์ธ์', index: 0, input: '์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค', isWordLike: true }
{ segment: ',', index: 5, input: '์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค', isWordLike: false }
{ segment: ' ', index: 6, input: '์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค', isWordLike: false }
{ segment: '๋ฐ๊ฐ์ต๋๋ค', index: 7, input: '์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค', isWordLike: true }
*/
granularity: 'sentence'
์ผ ๋ โผ
const segmenterKo = new Intl.Segmenter('ko', { granularity: 'sentence' });
const segmentsKo = segmenterKo.segment('์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค');
console.log([...segmentsKo]);
/*
{ "segment": "์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค", "index": 0, "input": "์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค" }
*/
granularity: 'grapheme'
์ผ ๋ โผ
const segmenterKo = new Intl.Segmenter('ko', { granularity: 'grapheme' });
const segmentsKo = segmenterKo.segment('์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค');
console.log([...segmentsKo]);
/*
{ "segment": "์", "index": 0, "input": "์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค" }
{ "segment": "๋
", "index": 1, "input": "์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค" }
{ "segment": "ํ", "index": 2, "input": "์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค" }
...
*/
isWordLike ํ๋กํผํฐ
๐ก isWordLike
ํ๋กํผํฐ๋ word
๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ๋ถ๋ฆฌํ์ ๋๋ง ํฌํจ๋๋ค
๋ง์ฝ word
๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ๋ถ๋ฆฌํ๋ค๋ฉด, ๋ชจ๋ ์ธ๊ทธ๋จผํธ๋ ๋จ์ด๋ฟ๋ง ์๋๋ผ ๊ณต๋ฐฑ(whitespace), ๊ตฌ๋์ (punctuation), ์ค๋ฐ๊ฟ(line breaks)์ ํฌํจํ ์ ์๋ค. ์ฌ๊ธฐ์ ๋จ์ด๋ง ์ถ์ถํ๊ณ ์ถ์ผ๋ฉด isWordLike
ํ๋กํผํฐ๋ฅผ ์ด์ฉํด ํํฐ๋ง ํ๋ฉด ๋๋ค. isWordLike
๋ ์ธ๊ทธ๋จผํธ๊ฐ ๋จ์ด์ ์ ์ฌํ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ด๋ค.
const segmenterKo = new Intl.Segmenter('ko', { granularity: 'word' });
const segmentsKo = segmenterKo.segment('์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค');
console.log([...segmentsKo].filter((s) => s.isWordLike));
/*
{ "segment": "์๋
ํ์ธ์", "index": 0, "input": "์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค", "isWordLike": true }
{ "segment": "๋ฐ๊ฐ์ต๋๋ค", "index": 7, "input": "์๋
ํ์ธ์, ๋ฐ๊ฐ์ต๋๋ค", "isWordLike": true }
*/
์ด๋ชจ์ง ๋ถ๋ฆฌํ๊ธฐ
์ด๋ชจ์ง๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ split()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋์ฝ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค. ์ด๋ชจ์ง ๋ฌธ์์ด์ ์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์กฐํฉํ ์ด๋ชจ์ง์ ๊ฒฝ์ฐ(๐จ๐จ๐ฆ๐ฆ) ๊ฐ ์ด๋ชจ์ง๊ฐ ๋ชจ๋ ๋ถ๋ฆฌ๋ผ์ ๋์ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
const emojis = '๐ซฃ๐ซต๐จ๐จ๐ฆ๐ฆ';
console.log(emojis.split('')); // Split by code units
// ['\uD83E', '\uDEE3', '\uD83E', '\uDEF5', '\uD83D', '\uDC68', '', ...]
console.log([...emojis]); // Split by code points
// ['๐ซฃ', '๐ซต', '๐จ', '', '๐จ', '', '๐ฆ', '', '๐ฆ']
์ ๋์ฝ๋ ๋ฌธ์์ด์ด ์๋ ์๊ฐ์ ์ด๋ชจ์ง๋ฅผ ๊ทธ๋๋ก ํ์ํ๊ณ ์ถ๋ค๋ฉด Intl.Segmenter
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
const emojis = '๐ซฃ๐ซต๐จ๐จ๐ฆ๐ฆ';
const segmenter = new Intl.Segmenter('en', { granularity: 'grapheme' });
const segments = segmenter.segment(emojis);
console.log(Array.from(segments, (s) => s.segment)); // ['๐ซฃ', '๐ซต', '๐จ๐จ๐ฆ๐ฆ']
๐ก Intl Explorer ์ฌ์ดํธ์์ API๋ฅผ ์ง์ ํ ์คํธํ๋ฉด์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค(Playground)
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Git] 1Password์ ์ ์ฅํ SSH ํค๋ก Git ์ปค๋ฐ ์๋ช ํ๊ธฐ (0) | 2024.05.18 |
---|---|
[CS] ์ค๋ฒํค๋ / ํ๋ก์ธ์ค / ์ค๋ ๋ (1) | 2024.05.18 |
[TS] ํ์ ์คํฌ๋ฆฝํธ์ ๊ณต๋ณ์ฑ / ๋ฐ๊ณต๋ณ์ฑ / ์ด๋ณ์ฑ (0) | 2024.05.17 |
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋? (0) | 2024.05.16 |
[TS] TypeScript ํ์ ์คํฌ๋ฆฝํธ satisfies ์ฐ์ฐ์ (0) | 2024.05.16 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Git] 1Password์ ์ ์ฅํ SSH ํค๋ก Git ์ปค๋ฐ ์๋ช ํ๊ธฐ
[Git] 1Password์ ์ ์ฅํ SSH ํค๋ก Git ์ปค๋ฐ ์๋ช ํ๊ธฐ
2024.05.18 -
[CS] ์ค๋ฒํค๋ / ํ๋ก์ธ์ค / ์ค๋ ๋
[CS] ์ค๋ฒํค๋ / ํ๋ก์ธ์ค / ์ค๋ ๋
2024.05.18 -
[TS] ํ์ ์คํฌ๋ฆฝํธ์ ๊ณต๋ณ์ฑ / ๋ฐ๊ณต๋ณ์ฑ / ์ด๋ณ์ฑ
[TS] ํ์ ์คํฌ๋ฆฝํธ์ ๊ณต๋ณ์ฑ / ๋ฐ๊ณต๋ณ์ฑ / ์ด๋ณ์ฑ
2024.05.17 -
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋?
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋?
2024.05.16