๋ฐ˜์‘ํ˜•

๊ทธ๋ฃนํ™” / ์บก์ฒ˜ํ™”


๊ทธ๋ฃนํ™” Grouping

์ •๊ทœ์‹์—์„œ ๊ทธ๋ฃนํ™”๋Š” ํŠน์ • ๋ฌธ์ž๋“ค์„ ๋‹จ์ผ ํ‘œํ˜„์‹(Single Entity)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ฃนํ™”๋Š” ๋ณดํ†ต ์บก์ฒ˜๋ง๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด ๋‘˜์„ ํ•จ๊ป˜ ์•Œ์•„๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉํ•œ + ์ˆ˜๋Ÿ‰์ž๋Š” 1๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ab(b 1๋ฒˆ ์ผ์น˜), abb(b 2๋ฒˆ ์ผ์น˜) ๋“ฑ์„ ๋ชจ๋‘ ์ผ์น˜ํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

const str = 'aabbbababaabb';
str.match(/ab+/g); // ['abbb', 'ab', 'ab', 'abb']

 

ํŠน์ • ๋ฌธ์ž ๊ทธ๋ฃน์˜ ๋ฐ˜๋ณต ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋ ค๋ฉด ์†Œ๊ด„ํ˜ธ()๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ๊ด„ํ˜ธ ์•ˆ ๋ฌธ์ž๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์ผ ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜ํ•œ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„  (ab)๋กœ ๋ฌถ์—ˆ์œผ๋ฏ€๋กœ ab๊ฐ€ 1๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ๋Š”๋‹ค.

const str = 'aabbbababaabb';
str.match(/(ab)+/g); // ['ab', 'abab', 'ab']

 

์บก์ฒ˜ํ™” Capturing

๐Ÿ’ก ์ž„์‹œ ๋ณ€์ˆ˜(\1, \2 ๋“ฑ)๋ฅผ ์ •๊ทœ์‹ ๋‚ด์—์„œ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์—ญ์ฐธ์กฐ(Back Reference)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์บก์ฒ˜ํ™”๋Š” ๊ด„ํ˜ธ๋กœ ๋ฌถ์€ ๋‹จ์ผ ํ‘œํ˜„์‹์„ \1, \2 ๊ฐ™์€ ์ž„์‹œ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ํ›„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋ณ€์ˆ˜๋Š” ๋ฐ– → ์•ˆ, ์ขŒ → ์šฐ ์ˆœ์„œ๋กœ ์ €์žฅํ•œ๋‹ค(์ •๊ทœ์‹ ์‹คํ–‰ ์ˆœ์„œ). ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ \1 ๋ณ€์ˆ˜์—” a, \2 ๋ณ€์ˆ˜์—” b๋ฅผ ์ €์žฅํ–ˆ์œผ๋ฏ€๋กœ abab์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ๋Š”๋‹ค.

const str = 'aabbbababaabb';
str.match(/(a)(b)\1\2/); // ['abab', 'a', 'b', index: 5, input: 'aabbbababaabb', groups: undefined]

 

str.match ๋ฉ”์„œ๋“œ์— ์บก์ฒ˜ ๊ทธ๋ฃน์ด ์žˆ์œผ๋ฉด, ์ „์ฒด ์ •๊ทœ์‹ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ’๊ณผ ์บก์ฒ˜ ๊ทธ๋ฃน ๊ฒฐ๊ณผ๊ฐ’์„ ํ•จ๊ป˜ ํฌํ•จํ•œ๋‹ค.

  1. (์ธ๋ฑ์Šค 0) str.match ๊ฒฐ๊ณผ๊ฐ’ : 'abab'
  2. (์ธ๋ฑ์Šค 1) 1๋ฒˆ ์บก์ฒ˜ ๊ทธ๋ฃน \1 ๊ฒฐ๊ณผ๊ฐ’ : 'a'
  3. (์ธ๋ฑ์Šค 2) 2๋ฒˆ ์บก์ฒ˜ ๊ทธ๋ฃน \2 ๊ฒฐ๊ณผ๊ฐ’ : 'b'

 

์•„๋ž˜ ์˜ˆ์‹œ์—์„  \1 ๋ณ€์ˆ˜์— ๊ทธ๋ฃนํ™”ํ•œ ๋ฌธ์ž ab๋ฅผ ์ €์žฅํ–ˆ๋‹ค. (ab)\1(ab)(ab) ์ด๋ฏ€๋กœ abab๋ฅผ ์ฐพ๋Š”๋‹ค.

const str = 'aabbbababaabb';
str.match(/(ab)\1/); // ['abab', 'ab', index: 5, input: 'aabbbababaabb', groups: undefined]

 

์†Œ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ๊ทธ๋ฃนํ™”๋จ๊ณผ ๋™์‹œ์— ์บก์ฒ˜ํ™”๊ฐ€ ์ด๋ค„์ง„๋‹ค. ๊ทธ๋ฃนํ™”๋งŒ ํ•„์š”ํ•˜๊ณ  ์บก์ฒ˜ํ™”๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด ๊ด„ํ˜ธ ์•ˆ์ชฝ ์‹œ์ž‘ ์ง€์ ์— ?: ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์บก์ฒ˜ํ™”๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

const str = 'aabbbababaabb';
str.match(/(?:ab)+/g); // ['ab', 'abab', 'ab']

 

์‘์šฉํ•˜๊ธฐ


๐Ÿ’ก ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์˜น์•Œ์ด(2) ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ

 

๋ฌธ์ž์—ด์— ํŠน์ • ๋‹จ์–ด๋ฅผ ํฌํ•จํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ๊ทธ๋ฃนํ™” / ์บก์ฒ˜ํ™”๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด one ํ˜น์€ two ๋ฌธ์ž๋ฅผ * ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

const str = 'abconedeftwoghy';
str.replaceAll(/(one|two)/g, '*'); // 'abc*def*ghy'

 

oneoneone ์ฒ˜๋Ÿผ 2๋ฒˆ ์ด์ƒ ์ค‘๋ณต๋œ ๋‹จ์–ด๋ฅผ ์ฐพ์„ ๋•Œ ์บก์ฒ˜ ๊ทธ๋ฃน์„ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ one ๋ฌธ์ž๋Š” \1 ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋ฏ€๋กœ (one)\1+(one)(one)+ ์™€ ๋™์ผํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์•ž์— one ์ด ํ•˜๋‚˜ ์žˆ๊ณ , ๊ทธ ๋’ค์— 1๊ฐœ ์ด์ƒ์˜ one์ด ์žˆ์œผ๋ฉด ์ผ์น˜ํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

'abconeoneonedefghy'.replaceAll(/(one)\1+/g, '1'); // 'abc1defghy'
'abconeonedefghy'.replaceAll(/(one)\1+/g, '1'); // 'abc1defghy'
'abconedefghy'.replaceAll(/(one)\1+/g, '1'); // 'abconedefghy' (์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž ์—†์Œ)

 

์ฐธ๊ณ ๋กœ {n, } ์ˆ˜๋Ÿ‰์ž๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค. n ๋’ค์— ์‰ผํ‘œ๊ฐ€ ์—†๋Š” {n} ์ˆ˜๋Ÿ‰์ž์™€๋Š” ๋‹ค๋ฅด๋ฏ€๋กœ ์ฃผ์˜ํ•˜์ž.

'abconeoneonedefghy'.replaceAll(/(one){2,}/g, '1'); // 'abc1defghy'
'abconeonedefghy'.replaceAll(/(one){2,}/g, '1'); // 'abc1defghy'
'abconedefghy'.replaceAll(/(one){2,}/g, '1'); // 'abconedefghy' (์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž ์—†์Œ)
  • {n, } : n๋ฒˆ ์ด์ƒ ์ผ์น˜
  • {n} : ์ •ํ™•ํžˆ n๋ฒˆ ์ผ์น˜

 

ํŒ - ํƒ์š•์ ์ธ ์ •๊ทœ์‹


์ •๊ทœ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ์š•์ (Greedy)์ด๋‹ค. ๋•Œ๋ฌธ์— ๋งค์นญํ•œ ๋ฌธ์ž ์ค‘ ๋” ๋งŽ๊ณ  ๊ธด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„  ? ์˜ต์…”๋„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ab, abc ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ •๊ทœ์‹์€ ํƒ์š•์ ์ด๋ฏ€๋กœ ๋” ๊ธด ๊ฐ’์ธ abc๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค.

const str = 'abc';
str.match(/abc?/); // ['abc', index: 0, input: 'abc', groups: undefined]

 

๋ฐ˜๋ฉด ์ˆ˜๋Ÿ‰์ž ๋’ค์— ?๋ฅผ ๋ถ™์ด๋ฉด ํƒ์š•์ ์ด์ง€ ์•Š๊ฒŒ(Lazy) ์ž‘๋™ํ•˜์—ฌ ๋” ์งง๊ณ  ์ ์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

const str = 'abc';
str.match(/abc??/); // ['ab', index: 0, input: 'abc', groups: undefined]

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•