JavaRush /Java Blog /Random-KO /์ •๊ทœ ํ‘œํ˜„์‹์˜ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
CynepHy6
๋ ˆ๋ฒจ 34
ะ’ะตะปะธะบะธะน ะะพะฒะณะพั€ะพะด

์ •๊ทœ ํ‘œํ˜„์‹์˜ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
๊ฒŒ์‹œ์ž: Eyal Schneider, 2009๋…„ 5์›” 21์ผ java.util.regex ํŒจํ‚ค์ง€๋Š” Java ๋ฒ„์ „ 1.4์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋ฉฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •๊ทœ ํ‘œํ˜„์‹์ด true ์ธ ๊ฒฝ์šฐ์—๋„์ง€๋Šฅ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์›์ธ์„ ์ดํ•ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ณ„์† ์ฝ์œผ์„ธ์š”. ์•„๋‹ˆ๋ฉด ํŽ˜์ด์ง€ ๋์œผ๋กœ ์Šคํฌ๋กคํ•˜์—ฌ Java์˜ ์ •๊ทœ์‹ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์œ ์šฉํ•œ 10๊ฐ€์ง€ ํŒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ง ๊ทธ๋ ‡๊ฒŒ ๋Š๋ฆฐ๊ฐ€์š”?

๋ฌธ์ž "a"์™€ "b"๊ฐ€ ํฌํ•จ๋œ ํ–‰๋งŒ ์„ ํƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (a*b*)* ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด "aaaaaaaaaaaaaaaaaaaaaaaaaaaax" ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„์‹์„ ์‹คํ–‰ํ•˜๋ฉด ์™„๋ฃŒ๋˜๊ธฐ๊นŒ์ง€ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆฌ๋ฉฐ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋‹ค๊ณ  ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ข‹์€ ์ •๊ทœ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (a|b)* ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” 1๋ฐ€๋ฆฌ์ดˆ๋„ ์ฑ„ ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ถ„๋ช…ํžˆ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ์ •๊ทœ ํ‘œํ˜„์‹ ์—”์ง„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Java๋Š” NFA(Non-Deterministic Finite Automata) ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—”์ง„์€ ์ •๊ทœ์‹ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ž…๋ ฅ ๋ฌธ์ž์—ด์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” "๋ง‰๋‹ค๋ฅธ ๊ณจ๋ชฉ"์— ๋„๋‹ฌํ•˜๋ฉด ์ ์ ˆํ•œ ๋Œ€์•ˆ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋Ÿ‰์ž( *, +, ? ) ๋ฐ ๊ต๋Œ€(์˜ˆ: a|b|c|d ) ์™€ ๊ฐ™์€ ์ •๊ทœ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ฒด ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด ์—ฐ๊ตฌ ๊ธฐ๋ฒ•์„ ์—ญ์ถ”์ ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋”์ฐํ•œ ์˜ˆ์—์„œ ์—”์ง„์€ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์„ ๋•Œ๊นŒ์ง€ ๊ธฐํ˜ธ "a"์˜ ๋ชจ๋“  ๊ณ„์—ด ๋ถ„ํ•ด๋ฅผ ๋” ์ž‘์€ ๊ณ„์—ด๋กœ ์‹ค์ œ๋กœ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์—ญ์ถ”์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์ธ ์‹œ๊ฐ„ ์ถ”์ • ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ NFA์˜ ์ค‘์š”ํ•œ ์†์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํŒจํ„ด๊ณผ ๊ฑฐ์˜ ์ผ์น˜ํ•˜๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ฒ€์ƒ‰์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ์ •๊ทœ์‹์— ์‚ฌ์šฉ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ์ ‘๊ทผ ๋ฐฉ์‹์€ DFA(Deterministic Finite Automaton)์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์ •๊ทœ์‹์€ ์—ญ์ถ”์  ์—†์ด ์ž…๋ ฅ ๋ฌธ์ž์—ด์„ ๋ฌธ์ž๋ณ„๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž๋™ ์žฅ์น˜๋ฅผ ์‹ค์ œ๋กœ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๊ทœ์‹์˜ ๋ณต์žก์„ฑ์— ๊ด€๊ณ„์—†์ด ์ „์ฒด ์ž…๋ ฅ์— ์„ ํ˜• ์‹œ๊ฐ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. NFA์—์„œ์™€ ๊ฐ™์ด ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋Œ€์‹  DFA๋Š” ๋ณ‘๋ ฌ ๊ฒ€์ƒ‰์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ Java(๋ฐ .NET, Perl, Python, Ruby, PHP ๋“ฑ)์—์„œ๋Š” ํ›จ์”ฌ ๋” ๋‚˜์€ ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” DKA๊ฐ€ ์•„๋‹Œ NKA๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ๊ทธ ์ด์œ ๋Š” NKA๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ด์ ์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋” ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผ๋˜๊ณ  ํ›จ์”ฌ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค( ์ž์„ธํ•œ ๋‚ด์šฉ์€ Sun์˜ ํŠœํ† ๋ฆฌ์–ผ ์ฐธ์กฐ ).
    • ๊ทธ๋ฃน ์บก์ฒ˜ ๋ฐ ๋ฐฑ๋งํฌ
    • ์œ„์น˜ ํ™•์ธ
    • ํ™•์žฅ ์ˆ˜๋Ÿ‰์ž(ํƒ์š•์Šค๋Ÿฝ๊ณ  ๊ฒŒ์œผ๋ฅธ)
์ธ๊ธฐ ์žˆ๋Š” ์šฉ์–ด์ธ NKA์™€ DKA๋Š” ์ •๊ทœ ํ‘œํ˜„์‹์˜ ๋งฅ๋ฝ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ๋ถ€์ •ํ™•ํ•˜๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์ด ๋‘ ๋ชจ๋ธ์€ ๋™์ผํ•œ ์ปดํ“จํŒ… ์„ฑ๋Šฅ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์˜คํ† ๋งˆํƒ€ ๋ชจ๋ธ์—์„œ๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ์ •๊ทœ์‹์„ ํ•˜๋‚˜์˜ ์˜คํ† ๋งˆํƒ€ ๋ชจ๋ธ์—์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๊ตฌํ˜„์ด ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๋‹ฌ๋ผ์ง€๋„๋ก ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. NKA ์—”์ง„์€ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ปดํ“จํŒ… ์„ฑ๋Šฅ ๋ฉด์—์„œ DKA๋ณด๋‹ค ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. DFA์˜ ์†๋„์™€ NFA์˜ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ์ •๊ทœ์‹์„ ๊ตฌํ˜„ํ•˜๋Š” "๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„" ๋ฐฉ๋ฒ•์ด ๋‘ ๊ฐ€์ง€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ตฌํ˜„์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ (์˜ˆ: ๋Ÿฐํƒ€์ž„์— ํŠน์ • ์—”์ง„์„ ์„ ํƒํ•˜๋Š” GNU egrep) ์ผ๋ถ€๋Š” ๋ชจ๋“  ์ด์ ์„ ๊ฐ–์ถ˜ ์ง„์ •ํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฒ„์ „(์˜ˆ: Tcl ์ •๊ทœ์‹)์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์กฐ์–ธ

๋‹ค์Œ์€ Java์—์„œ ์ •๊ทœ์‹ ํšจ์œจ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํŒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ๋‹ค์ˆ˜๋Š” ์ˆ˜์ต์„ ์ค„์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
1) ์‚ฌ์ „ ์ปดํŒŒ์ผ
์ง„๋ถ€ํ•˜์ง€๋งŒ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๊ทœ์‹์„ ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. // ะบะพะผะฟะธะปัั†ะธั p = Pattern.compile(regex, flags); โ€ฆ // ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต Matcher a = p.matcher(input);
2) ๊ฒŒ์œผ๋ฅธ ์ˆ˜๋Ÿ‰์ž vs ํƒ์š•์Šค๋Ÿฌ์šด ์ˆ˜๋Ÿ‰์ž
๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰์ž( * + ? )๋Š” ํƒ์š•์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๊ธด ์‹œํ€€์Šค์™€ ์ผ์น˜๋ฅผ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ ์ฐจ์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์—…ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ์น˜ ํ•ญ๋ชฉ์ด ์งง๋‹ค๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์ง€์—ฐ ์ˆ˜๋Ÿ‰์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž‘์€ ์ผ์น˜ ํ•ญ๋ชฉ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋” ๋ฉ€๋ฆฌ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. "hello" ์‹œํ€€์Šค์™€ ์ผ์น˜ํ•˜๋Š” ํ–‰๋งŒ ์ฐพ๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ .*hello.*๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ "hello"๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ…์ŠคํŠธ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋” ๊ฐ€๊น๊ฒŒ ๋‚˜ํƒ€๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด .*?hello.*๊ฐ€ ํ‰๊ท ์ ์œผ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
3) ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ดˆํƒ์š• ์ˆ˜๋Ÿ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋งŒ ์ผ๋ฐ˜ ๋™์ž‘์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฒŒ์œผ๋ฅธ ์ˆ˜๋Ÿ‰์ž์™€ ๋‹ฌ๋ฆฌ, ์ดˆํƒ์š•์  ์ˆ˜๋Ÿ‰์ž๋Š” ์‹ค์ œ๋กœ ์ •๊ทœ ํ‘œํ˜„์‹์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ๋Œ€์‹  *+ ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ํ•ญ๋ชฉ์€ ํƒ์š•์ (์ฆ‰, *์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ ์ผ์น˜ )์ด ๋˜์ง€๋งŒ, ์ „์ฒด ๊ฒ€์ƒ‰์ด ์‹คํŒจํ•˜๋”๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ํด๋ฐฑ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ์ œ ์œ ์šฉํ• ๊นŒ์š”? ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ํ…์ŠคํŠธ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ \"[^\"]*\"๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ€์ •์ ์ธ ๊ฒฝ์šฐ(์˜ˆ: "bla bla bla)"์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. \"[^\"]*+\"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค . ํ‘œํ˜„์˜ ์˜๋ฏธ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค. ๋…๋ฆฝ์ ์ธ ๊ทธ๋ฃนํ™”๋Š” ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ณ  ๋” ๋งŽ์€ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค( Sun์˜ ์ž์Šต์„œ ์ฐธ์กฐ ).
4) ๊ทธ๋ฃน ์บก์ฒ˜๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค
๊ด„ํ˜ธ ์•ˆ์˜ ํ‘œํ˜„์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ฃน์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์— ์•ฝ๊ฐ„์˜ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ( ๋Œ€์‹  (?: ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ๋ฃน์„ "์บก์ฒ˜ํ•  ์ˆ˜ ์—†๊ฒŒ" ๋งŒ๋“ญ๋‹ˆ๋‹ค .
5) ์ธํ„ฐ๋ฆฌ๋น™์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”
์ธํ„ฐ๋ฆฌ๋ธŒ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: Paul|Jane|Chris ) ์—”์ง„์ด ์˜ต์…˜์„ ์ผ์น˜์‹œํ‚ค๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ˆœ์„œ๋Š” ํ•ด๋‹น ์˜ต์…˜์ด ๋‚˜ํƒ€๋‚˜๋Š” ์ˆœ์„œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ  ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ต์…˜์„ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋” ๊ฐ€๊น๊ฒŒ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ‰๊ท  ๊ธ์ •์  ์‘๋‹ต ์‹œ๊ฐ„์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
6) ๋ชจํ˜ธํ•จ์„ ํ”ผํ•˜๋ผ
์ž…๋ ฅ ๋ฌธ์ž์—ด์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ผ์น˜ ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •๊ทœ์‹์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ์‚ฌ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ œ๊ณต๋œ ์ •๊ทœ์‹ (a*b*)*๋ฅผ ์‚ฌ์šฉ ํ•˜๋ฉด "aabb" ๋ฌธ์ž์—ด์ด ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐฉ์‹์œผ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด (a2b2) (a1)(a1)(b1)(b1) (a2)(b2) (a1)(a1b2) etcโ€ฆ Regexp (a|b)*๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ž์—ด๋งŒ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฑฐ์˜ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์ต์„ ์ค„์ด๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
7) ๋ฏธ๋ฆฌ๋ณด๊ธฐ
๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ์œ„์น˜์˜ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์— ์‹œํ€€์Šค์— ๋Œ€ํ•œ ์ œํ•œ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ถ€์ •์ ์ธ ์˜ˆ์ธก์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹ํฌํ•จ๋˜์ง€ ์•Š์€ ํ–‰์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์—†์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”!). ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๊นŒ? ๋งํฌ ํƒœ๊ทธ์—์„œ URL์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ •๊ทœ์‹์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. a .* href=(\S*).*/ ์ผ๋ฐ˜ ํƒœ๊ทธ์˜ ๊ฒฝ์šฐ ์ด ํ‘œํ˜„์‹์€ ํ…์ŠคํŠธ์— "href" ์†์„ฑ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ฃผ์†Œ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค(\S๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฌธ์ž์— ์‚ฌ์šฉ๋จ). ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ถ€ ํŠน์ดํ•œ ํƒœ๊ทธ์—์„œ๋Š” ๋กค๋ฐฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: โ€œa href= href=href=โ€ฆ href=๋ญ”๊ฐ€.โ€ ๋‹ค์Œ ์ •๊ทœ์‹์€ ํ‘œํ˜„์‹์˜ ".*"๋ฅผ "href"์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๊ฟ€ ๋•Œ ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. a ((?!href).)* href=(\S*)((?!href).)*/
8) ๊ธธ์ด ์ง€์ •
Java์—๋Š” ์ •๊ทœ์‹์—์„œ ์–ป์€ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๊ธธ์ด์— ๋Œ€ํ•ด ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ์ •๊ทœ์‹ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰์„ ์ฆ‰์‹œ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•˜๋ ค๋ฉด ๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [01]{6}์€ 6์ž ๊ธธ์ด์˜ ๋ชจ๋“  ์ด์ง„ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
9) ๋™์ผํ•œ ๋ผ์ธ ์„ ํƒ
๋•Œ๋•Œ๋กœ ๋™์ผํ•œ ๋ฌธ์ž์—ด์ด ๊ทธ๋ฃน์ด๋‚˜ ๋Œ€์•ˆ ๋‚ด๋ถ€์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. (hello|hell|heel) ์ด ํ‘œํ˜„์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹จ์ˆœํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. he(llo|ll|el) ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ •๊ทœ์‹ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์— ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
10) ์ •๊ทœ์‹ ํ…Œ์ŠคํŠธ
์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋จผ์ € ์ •๊ทœ์‹์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํ‘œํ˜„์‹์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋งˆ์ดํฌ๋กœ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. ๋‹ค์–‘ํ•œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ์™€ ์ƒ˜ํ”Œ๊ณผ ๊ฑฐ์˜ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ:

http://java.sun.com/docs/books/tutorial/essential/regex/index.html http://www.javaworld.com/javaworld/jw-09-2007/jw-09-optimizingregex.html?page =1 http://www.softec.st/en/OpenSource/DevelopersCorner/RegularExpressions/RegularExpressionEngines.html http://www.devarticles.com/c/a/Java/NFA-DFA-POSIX-and-the-Mechanics -ํ‘œํ˜„ ์ฒ˜๋ฆฌ/
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION