[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)
๋ ํผ๋ฐ์ค
How to split JavaScript strings into sentences, words or graphemes with "Intl.Segmenter"
Intl.Segmenter enables you to split strings into meaningful parts such as words, sentences and graphemes.
www.stefanjudis.com
'๐ช 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