E D R S I H C RSS
ID
Password
Join
๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์ „์— ๋ชจ๋“  ๊ฒƒ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์•Œ๊ณ ์ž ๊ณ ์ง‘ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฒฐ์ฝ” ๊ฒฐ๋‹จ์„ ๋‚ด๋ฆฌ์ง€ ๋ชปํ•œ๋‹ค. โ€•์•™๋ฆฌ F.์•„๋ฏธ์—˜(์Šค์œ„์Šค ์‹œ์ธ)

๏ปฟ * ๊ทธ๋ƒฅ ํผ๋‹ค๋†“์•˜์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ๋‚˜ ์—†์–ด์งˆ ์ž๋ฃŒ์ผ๋“ฏํ•˜๊ธฐ๋„ ํ•ด์„œ... :)

GNU REGEX (์ •๊ทœํ‘œํ˜„์‹) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์ขŒ (1) 
------------------------------------------- 

๊ธ€์“ด์ด : ํ•œ๋™ํ›ˆ ddoch at hitel.kol.co.kr 
๋‚  ์งœ : 1997.5.23. 
์ €์ž‘๊ถŒ : ์ƒ์—…์ ์ธ ์šฉ๋„๊ฐ€ ์•„๋‹Œํ•œ ์–ด๋””๋กœ๋“  ์ด๋™ ๋ฐ ๊ฒŒ์žฌ ๊ฐ€๋Šฅ 
๋ถ€ํƒ์‚ฌํ•ญ : ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด๋‚˜ ๋‹ต๋ณ€์„ ์š”ํ•˜๋Š” ๋‚ด์šฉ์€ ๋ฉ”์ผ๋กœ ์ ์–ด์ฃผ์ง€ 
๋งˆ์‹œ๊ณ  ๊ด€๋ จ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒŒ์‹œํŒ์„ ์ด์šฉํ•ด ์ฃผ์‹œ๋ฉด ์„ฑ์˜๊ป ๋‹ต๋ณ€ํ•ด 
๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๋‹นํžˆ ๊ฒŒ์œผ๋ฅธ ๊ด€๊ณ„๋กœ ์งˆ๋ฌธ๋ฉ”์ผ์— ์ œ๋Œ€๋กœ ๋‹ต 
๋ณ€์„ ๋ชปํ•ด๋“œ๋ฆฌ๊ณ  ์žˆ๋Š” ์  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. 


โ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–ค 
โ–ค ๋ชฉ์ฐจ โ–ค 
โ–ค โ–ค 
โ–ค 1. ๋“ค์–ด๊ฐ€๋Š” ๋ง โ–ค 
โ–ค 2. ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ๋ฒ• โ–ค 
โ–ค 3. ๊ณตํ†ต์ ์ธ ์˜คํผ๋ ˆ์ดํ„ฐ โ–ค 
โ–ค 4. GNU ์˜คํผ๋ ˆ์ดํ„ฐ โ–ค 
โ–ค 5. GNU ์ด๋งฅ์Šค ์˜คํผ๋ ˆ์ดํ„ฐ โ–ค 
โ–ค 6. Regex ํ”„๋กœ๊ทธ๋ž˜๋ฐ โ–ค 
โ–ค 1) BSD Regex ํ•จ์ˆ˜ โ–ค 
โ–ค 2) POSIX Regex ํ•จ์ˆ˜ โ–ค 
โ–ค 3) GNU Regex ํ•จ์ˆ˜ โ–ค 
โ–ค 7. ๋‚˜์˜ค๋Š” ๋ง โ–ค 
โ–ค โ–ค 
โ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–ค 

1. ๋“ค์–ด๊ฐ€๋Š” ๋ง 
--------------- 

์•ˆ๋…•ํ•˜์„ธ์š”. ddoch ํ•œ๋™ํ›ˆ ์ž…๋‹ˆ๋‹ค. 

flex ์™€ bison ์„ ๊ณต๋ถ€ํ•˜๋˜ ์ค‘ regex์— ๋Œ€ํ•œ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ regex 
๋ฉ”๋‰ด์–ผ (์ž๋ฃŒ์‹ค/๋ฌธ์„œ/2027๋ฒˆ ๋ฌธ์„œ/regex.zip)๋กœ ๊ณต๋ถ€๋ฅผ ํ•˜๋˜ ์ค‘ ๊ทธ๋ƒฅ๋ฒˆ์—ญํ•˜๋Š” 
๊ฒƒ ๋ณด๋‹ค๋Š” ์‹ค์ œ ์˜ˆ๋ฅผ ๋“ค์–ด๊ฐ€๋ฉด์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์ด๋ ‡๊ฒŒ ๊ฐ•์ขŒ๋กœ ์˜ฌ 
๋ฆฝ๋‹ˆ๋‹ค. 

์ด ๊ฐ•์ขŒ ๋‚ด์šฉ์€ ์œ„ ๋ฉ”๋‰ด์–ผ์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช…์„ ๋“œ๋ฆด ์˜ˆ์ •์ด๋ฉฐ ์ˆœ์„œ ๋˜ํ•œ 6. Regex 
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค‘ ๋‚œ์ด๋„์— ๋”ฐ๋ผ ๋น„๊ต์  ์‰ฌ์šด "BSD Regex ํ•จ์ˆ˜" ๋ถ€ํ„ฐ ์„ค๋ช…์„ ํ•˜์˜€๋‹ค 
๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ค‘๊ฐ„์ค‘๊ฐ„ ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•ด ์˜ˆ์ œ๋กœ ์„ค๋ช…์„ 
ํ•˜๊ฒ ์œผ๋ฉฐ ์„ค๋ช…๋‚ด์šฉ ์ค‘ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋‚˜ ์ฐธ๊ณ ์‚ฌํ•ญ์€ ์œ„์˜ ์ฃผ์†Œ๋กœ ๋ณด๋‚ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜ 
๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ค๋ช… ์ค‘ ๋ชจ์ž๋ผ๋Š” ๋ถ€๋ถ„์ด๋‚˜ ๋น ์ง„ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, 
์œ„์—์„œ ๋ง์”€๋“œ๋ฆฐ ๋ฉ”๋‰ด์–ผ์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ผ๊ฒ ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  6์žฅ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋‚ด์šฉ์€ ์ผ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค ๋ฐ ์œ ๋‹‰์Šค ์‚ฌ์šฉ์ž๋“ค์ด ์ฐธ์กฐํ•  ์ˆ˜ 
์žˆ๋Š” ๊ณตํ†ต์ ์ธ ๋‚ด์šฉ์ด๋ฉฐ 6์žฅ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. 

regex๋Š” ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•˜์—ฌ ํŒจํ„ด ๊ฒ€์ƒ‰ ๋ฐ ๋งค์นญ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต 
ํ•˜๋Š” ์ผ์ข…์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Linux ๋‚˜ UNIX์—์„œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„์ฃผ ๊ด‘๋ฒ”์œ„ 
ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์–ด ์‚ฌ์šฉ์ž ์ˆ˜์ค€์—์„œ์˜ ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ 
๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฆฌ๋ˆ…์Šค๋‚˜ ์œ ๋‹‰์Šค๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด์„œ ์‰˜์ƒ์—์„œ, 

queen:~$ xanim [a-g]*.gif 

์ด๋Ÿฐ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด๋ณด์‹  ๋ถ„๋“ค์ด ๋งŽ์ด ๊ณ„์‹ค ๊ฒ๋‹ˆ๋‹ค. 
ํ‘œ์ค€ ์‰˜๋งŒ์ด ์•„๋‹ˆ๋ผ, ed, ex, sed, awk, vi, emacs, grep, egrep๋“ฑ์˜ ์œ ๋‹‰์Šค ํ‘œ์ค€ 
์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค๊ณผ postgres, bison, flex๋“ฑ์˜ ํˆด ๋“ค์—์„œ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ์„ ํ•˜๋ฉฐ, 
ํ”„๋กœ๊ทธ๋žจ์„ ์ง์ ‘ ์„ค์น˜ํ•ด๋ณด์‹  ๋ถ„์€ ์†Œ์Šค๋””๋ ‰ํ† ๋ฆฌ์•ˆ์— "regex.h, regex.c"๋ผ๋Š” ํŒŒ์ผ 
์ด ๋“ค์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ข…์ข… ๋ณด์…จ์„ ๊ฒ๋‹ˆ๋‹ค. 

์ด๋Ÿฐ ์ •๊ทœํ‘œํ˜„์‹์€ bison, flex์—์„œ๋„ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•˜์˜€๋Š” ๋ฐ, ์ด๊ฒƒ์€ ๊ฐ์ข… ๋ฌธ์ž์—ด 
ํŒŒ์‹ฑ์ด๋‚˜ ๋ฌธ์žฅ, ๊ตฌ๋ฌธํ•ด์„์— ์‚ฌ์šฉ๋˜์–ด ์ปดํŒŒ์ผ๋Ÿฌ ์ œ์ž‘, ์–ด๋ฌธํ•ด์„๊ธฐ ๋“ฑ์˜ ํ”„๋กœ๊ทธ๋žจ์„ 
๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.์•„์ง ์ •๊ทœํ‘œํ˜„์‹์—์„œ "[๊ฐ€-๋‚˜]"์™€ ๊ฐ™์€ ํ•œ๊ธ€์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชป 
ํ•˜๊ณ  ์žˆ๋Š” ๋ฐ, ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ํ•œ๊ธ€์–ดํœ˜๋ถ„์„๊ธฐ ๋ฐ ํ•œ๊ธ€ํ† ํฐ๋ถ„์„์— ๋‚œ์ œ๋กœ ๋“ฑ์žฅํ•˜๊ณ  ์žˆ 
๋Š” ๊ด€๊ณ„๋กœ ์ด์˜ ํ•ด๊ฒฐ์€ ์šฐ๋ฆฌ๋“ค์˜ ๋ชซ์ด ์•„๋‹๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 

์„ค์น˜๋Š”, ๋ฆฌ๋™ ์ž๋ฃŒ์‹ค์— ์žˆ๋Š” regex 0.12 ๋ฒ„์ ผ (์ž๋ฃŒ์‹ค/2370๋ฒˆ/regex012.tgz)์„ 
๋ฐ›์œผ์…”์„œ root๋กœ ์••์ถ•์„ ํ‘ธ์‹œ๊ณ  "./configure; make; make install"๋กœ ์„ค์น˜๋ฅผ 
ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›์—์„œ ๊ตฌํ•˜์‹ค๋ ค๋ฉด GNU ๊ณต์‹ ์‚ฌ์ดํŠธ๋‚˜ ํ•œ๊ตญ์—์„œ ๋ฏธ๋Ÿฌ๋ฅผ ํ•˜๊ณ  
์žˆ๋Š” ์นด์ด์ŠคํŠธ์—์„œ "regex" ๋กœ ๊ฒ€์ƒ‰ํ•˜์‹œ๋ฉด ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๋ง์ด ์„ค์น˜์ง€, ์„ค์น˜๋˜๋Š” ๊ฒƒ์€ info ํŒŒ์ผ๊ณผ texi ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ ํ•ด๋‹น๋””๋ ‰ํ† ๋ฆฌ๋กœ 
์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์••์ถ•์„ ํ‘ผ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณด์‹œ๋ฉด regex.c ์™€ regex.h๊ฐ€ 
์žˆ๋Š” ๋ฐ, ์ด ๋‘๊ฐœ๊ฐ€ ์ „๋ถ€์ด๋ฏ€๋กœ ํœด๋Œ€๋ฅผ ํ•˜์‹œ๋ฉด์„œ ์‚ฌ์šฉํ•˜์‹œ๋˜์ง€, ์•„๋‹ˆ๋ฉด regex.o 
ํŒŒ์ผ๋กœ ๋งํฌ๋งŒ ์‹œํ‚ค์‹œ๋˜์ง€๋Š” ๋งˆ์Œ๋Œ€๋กœ ํ•˜์‹œ๋ฉด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์Šฌ๋ž™ 3.1์— 
"/usr/include"์—๋„ "regex.h"๊ฐ€ ์žˆ์œผ๋‚˜ ๋ณธ ํ—ค๋”ํŒŒ์ผ๊ณผ๋Š” ๋‹ค๋ฅด๋ฏ€๋กœ ์ธํด๋ฃจ๋“œ ํ•˜์‹ค 
๋•Œ ์ฃผ์˜ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ "test/" ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์œผ๋ฏ€๋กœ ์‚ดํŽด๋ณด์‹œ๋ฉด 
๋„์›€์ด ๋  ๊ฒƒ์ด๋ฉฐ, ํ…Œ์ŠคํŠธ ์†Œ์Šค ์ปดํŒŒ์ผ์€ "test/" ๋””๋ ‰ํ† ๋ฆฌ์—์„œ "make all" ๋กœ ํ•˜ 
์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

"regex.h" ํŒŒ์ผ์— ์•„์ฃผ ์ž์„ธํ•œ ์„ค๋ช…์ด ๋“ค์–ด ์žˆ์œผ๋ฏ€๋กœ ์ž์ฃผ ์ฐธ๊ณ ๋ฅผ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ผ๋ฉฐ, 
ํ•œ๋ถ€ ๋ฝ‘์•„์„œ ๋ณด์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค. 

์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์งœ์‹œ๋ ค๋Š” ๋ถ„๋“ค์ด๋‚˜ ์ •๊ทœํ‘œํ˜„์‹์„ ์ตํžˆ์‹œ๋ ค๋Š” ๋ถ„ 
๋“ค์—๊ฒŒ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. 

์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์ธ egrep์„ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค๋‚ด์—์„œ ํŠน์ • ํ† ํฐ(์˜ˆ: int) 
์„ ์ฐพ๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

queen:~$ egrep int something.c 
... 
์ด๋Ÿฐ์‹์œผ๋กœ ์ฐพ์œผ๋ฉด "printf" ๋„ ๊ฐ™์ด ๊ฒ€์ƒ‰์ด ๋˜๋ฏ€๋กœ ์š”๊ตฌ๋ฅผ ์ฑ„์›Œ์ฃผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. 

queen:~$ egrep "[^[:alnum:]_]int[^[:alnum:]_]" something.c 

์ด์ œ, ํ•˜๋‚˜์˜ ๋…๋ฆฝ๋œ ํ† ํฐ์œผ๋กœ์„œ์˜ "int"๋งŒ ์ฐพ์•„์„œ ์šฐ๋ฆฌ์—๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. 

๋งŒ์ผ, egrep ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์„ ์งค ๋•Œ, ์ฒซ๋ฒˆ์งธ ์ธ์ž(์ •๊ทœํ‘œํ˜„์‹)๋ฅผ ์ผ์ผ์ด C๋กœ ํŒŒ์‹ฑ 
ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์‚ฌ๋žŒ์˜ ์ธ๋‚ด์„ฑ์˜ ํ•œ๊ณ„๋ฅผ ์‹คํ—˜ํ•˜๋Š” ๊ฒƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
์ด๋Ÿด ๋•Œ ๋ฏธ๋ฆฌ ์งœ๋†“์€ regex ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ํŽ‘์…˜์—์„œ ์ฒซ๋ฒˆ์งธ ์ธ์ž์™€ ํ•ด๋‹นํŒŒ 
์ผ์„ ์ฝ์€ ๋ฌธ์ž์—ด์„ ๋„˜๊ฒจ์ฃผ๋ฉด ์•Œ์•„์„œ ๊ฒ€์ƒ‰ ๋ฐ ํŒจํ„ด ๋งค์นญ์„ ํ•ด์ฃผ๋ฏ€๋กœ ์•„์ฃผ ๊ฐ„ํŽธํ•˜ 
๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์ •๊ทœํ‘œํ˜„์‹์—๋„ ์ƒ๋‹นํžˆ ๋งŽ์€ ํ˜•ํƒœ์˜ ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ฒœ์ฒœํžˆ ๋ณด์—ฌ๋“œ๋ฆฌ๋„๋ก ํ•˜ 
๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ•์ขŒ ๋งˆ์ง€๋ง‰์— ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ธฐ 
๋Šฅ์˜ egrep ๋ฒ„์ ผ์„ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

์ž, ๊ทธ๋Ÿผ ์ด์ œ ์„ค๋ช…์— ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”.. 

2. ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ๋ฒ• 
------------------- 

์ •๊ทœํ‘œํ˜„์‹์€ ์–ด๋–ค ๋ฌธ์ž์—ด์˜ ์ง‘ํ•ฉ์„ ๋ฌ˜์‚ฌํ•˜๋Š” ํ…์ŠคํŠธ ์ŠคํŠธ๋ง์ž…๋‹ˆ๋‹ค. 
์˜คํผ๋ ˆ์ดํ„ฐ๋Š” '['๋‚˜ '*'๊ฐ™์€ ํ•œ๊ฐœ ์ด์ƒ์˜ ๋ฌธ์ž์™€ ๋งค์นญ๋˜๋Š” ์ •๊ทœํ‘œํ˜„์‹์•ˆ์— ์žˆ๋Š” 
๋ฌธ์ž์ž…๋‹ˆ๋‹ค. 
์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ž๋Š” 'a'๋‚˜ 'z'์™€ ๊ฐ™์ด ๊ทธ ์ž์ฒด๋กœ์„œ์˜ ๋ฌธ์ž๊ทธ๋ž˜๋กœ์˜ ๋œป 
์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์—ฌ๊ธฐ์„œ๋Š” "๊ทธ๋ƒฅ๋ฌธ์ž(ordinary) ๋˜๋Š” ์ผ๋ฐ˜๋ฌธ์ž"๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ 
๋‹ค. ์ด์™€๋Š” ๋ฐ˜๋Œ€๋กœ '.'์™€ ๊ฐ™์ด ํŠน์ˆ˜ํ•œ ๋œป์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž๋ฅผ "ํŠน์ˆ˜๋ฌธ์ž(special)" 
๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. 
์–ด๋–ค ๋ฌธ์ž๊ฐ€ ํŠน์ˆ˜๋ฌธ์ž์ธ์ง€ ๋˜๋Š” ๊ทธ๋ƒฅ๋ฌธ์ž์ธ์ง€๋Š” ๋‹ค์–‘ํ•œ ์ •๊ทœํ‘œํ˜„์‹์˜ ๋ฌธ๋ฒ•๊ณผ ํ•ด๋‹น 
์ •๊ทœํ‘œํ˜„์‹์—์„œ์˜ ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด์ œ, ์•„๋ž˜์—์„œ ์ž์„ธํ•˜๊ฒŒ ์ด์•ผ๊ธฐ ํ•˜ 
๊ฒ ์Šต๋‹ˆ๋‹ค. 

2.1 ๋ฌธ๋ฒ• ๋น„ํŠธ 
-------------- 

์ •๊ทœํ‘œํ˜„์‹์—์„œ ์–ด๋–ค ํŠน์ •ํ•œ ๋ฌธ๋ฒ•์€ ๋ช‡๋ช‡์˜ ๋ฌธ์ž๋“ค์„ ํ•ญ์ƒ ํŠน์ˆ˜๋ฌธ์ž๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , 
๋‹ค๋ฅธ ๋ฌธ๋ฒ•์€ ๊ฐ€๋” ํŠน์ˆ˜๋ฌธ์ž๋กœ ์ทจ๊ธ‰ํ•˜๋ฉฐ, ๋˜๋‹ค๋ฅธ ๋ฌธ๋ฒ•์€ ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ž๋“ค์„ ์ผ๋ฐ˜๋ฌธ์ž 
๋กœ ์ทจ๊ธ‰ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ฃผ์–ด์ง„ ์ •๊ทœํ‘œํ˜„์‹์—์„œ Regex๊ฐ€ ์ธ์‹ํ•˜๋Š” ํŠน์ •ํ•œ ๋ฌธ๋ฒ•์€ ํ•ด๋‹น ์ •๊ทœํ‘œํ˜„์‹์˜ ํŒจํ„ด 
๋ฒ„ํผ์˜ syntax ํ•„๋“œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ง์€ ์œ„์˜ ์˜ˆ์—์„œ ์ •๊ทœํ‘œํ˜„์‹ ์ค‘์—์„œ 
"[:alpha:]"๊ฐ™์€ ๊ฒƒ๋“ค์ด ์ด ํŒจํ„ด์„ ๋‹ค๋ฃจ๋Š” ๋ฒ„ํผ์ค‘์—์„œ syntax ํ•„๋“œ์— ๋”ฐ๋ผ ํ‹€๋ฆฐ 
๋ฌธ๋ฒ•์œผ๋กœ ์น˜๋ถ€๋  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ 
ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ syntax ํ•„๋“œ๋ฅผ ์กฐ์ •ํ•ด์คŒ์œผ๋กœ์จ ์ •๊ทœํ‘œํ˜„์‹ 
์˜ ๊ธฐ๋Šฅ์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ œํ•œํ•˜๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋˜๊ฒ ๋„ค์š”. 

ํŒจํ„ด ๋ฒ„ํผ๋Š” "[a-g]*"์™€ ๊ฐ™์€ ์ •๊ทœํ‘œํ˜„์‹์„ ๋’ค์—์„œ ์„ค๋ช…ํ•˜๋Š” ์ •๊ทœํ‘œํ˜„์‹ "์ปดํŒŒ์ผ" 
ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ฒจ์คŒ์œผ๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

(์ฐธ๊ณ ๋กœ, ์—ฌ๊ธฐ์„œ "์ปดํŒŒ์ผ"์ด๋ผํ•จ์€, ํ…์ŠคํŠธ ์ŠคํŠธ๋ง ํ˜•ํƒœ์˜ ์ •๊ทœํ‘œํ˜„์‹์„ ๊ฒ€์ƒ‰,๋งค์นญ 
ํ• ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฒ„ํŽด(ํŒจํ„ด ๋ฒ„ํผ)์— ๋ฒˆ์—ญ์„ ํ•˜๊ฑฐ๋‚˜ ์ด์— ํ•„์š” 
ํ•œ ๊ฐ์ข… ๊ฐ’์„ ๋‹ด์•„๋‘๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ) 

syntax ํ•„๋“œ๋Š” ๋‹ค์–‘ํ•œ ๋น„ํŠธ๋“ค์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๋น„ํŠธ๋“ค์„ ๋ณดํ†ต, 
"๋ฌธ๋ฒ• ๋น„ํŠธ"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ๋ฒ• ๋น„ํŠธ๋Š” "์–ด๋–ค ๋ฌธ์ž๊ฐ€ ์–ด๋–ค ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ 
๋ ๊ฒƒ์ธ๊ฐ€"ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

์ด์ œ, ๋ฌธ๋ฒ• ๋น„ํŠธ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ์ ์œผ๋กœ, ์ด 
๊ฒƒ์€ "regex.h"์— ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ "RE_"๋กœ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

์–ธ๋œป ์ •์˜๋œ ์ด๋ฆ„๋งŒ์œผ๋กœ๋„ ๊ทธ ๊ธฐ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ์˜ˆ๊ฒฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

* RE_BACKSLASH_ESCAPE_IN_LISTS (๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐฑ์Šฌ๋ž˜์‰ฌ๋Š” ์ด์Šค์ผ€์ดํ”„) 

์ผ๋ฐ˜์ ์ธ ๋ฆฌ์ŠคํŠธ ์˜คํผ๋ ˆ์ดํ„ฐ์ธ '[', ']'์•ˆ์—์„œ '\'(์ด์Šค์ผ€์ดํ”„)๋ฌธ์ž๋Š” ๋’ท๊ธ€์ž 
๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•˜๋Š” ํƒˆ์ถœ๋ฌธ์ž๊ฐ€ ๋œ๋‹ค๋Š” ์ด์•ผ์ง€์ด์ง€์š”. ๋งŒ์ผ ์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜ 
์ง€ ์•Š์œผ๋ฉด ๋ฆฌ์ŠคํŠธ ์˜คํผ๋ ˆ์ดํ„ฐ์•ˆ์—์„œ์˜ '\'๋Š” ๊ทธ๋ƒฅ๋ฌธ์ž(=์ผ๋ฐ˜๋ฌธ์ž)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

๋ณดํ†ต, ๋ฆฌ์ŠคํŠธ ์˜คํผ๋ ˆ์ดํ„ฐ ์•ˆ์˜ ๋ฌธ์ž๋Š” ํŠน์ˆ˜๋ฌธ์ž ์„ฑ๊ฒฉ์„ ์ƒ์‹คํ•˜๊ณ  ๊ทธ๋ƒฅ๋ฌธ์ž๊ฐ€ ๋˜ 
๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. 

* RE_BK_PLUS_QM ('\+', '\?') 

์ด ๋น„ํŠธ๊ฐ€ ์„ค์ •๋˜๋ฉด '\+'๋Š” "ํ•˜๋‚˜์ด์ƒ์„ ๋งค์นญ์‹œํ‚ค๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ(์ดํ›„ ํ•˜๋‚˜์ด์ƒ 
์˜คํผ๋ ˆ์ดํ„ฐ)(match-one-or-more operator)"๊ฐ€ ๋˜๋ฉฐ, '\?'๋Š” "0๊ฐœ ์ด์ƒ์„ ๋งค์นญ 
์‹œํ‚ค๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ (์ดํ›„ ๋ปฅ๊ฐœ์ด์ƒ (^^ ์˜คํผ๋ ˆ์ดํ„ฐ)"(match-zero-or-more 
operator)์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋น„ํŠธ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด, ๊ฐ๊ฐ '+'์™€ '?'๊ฐ€ ๊ทธ ์—ญํ• ์„ 
๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค. 

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ณดํ†ต, '+', '?'๊ฐ€ ๊ฐ๊ฐ ํ•˜๋‚˜์ด์ƒ, 0๊ฐœ ์ด์ƒ์„ ๋งค์นญ์‹œํ‚ค๋Š” ์˜คํผ๋ ˆ์ด 
ํ„ฐ๋กœ ์ž‘๋™์„ ํ•ฉ๋‹ˆ๋‹ค. 
๋งŒ์ผ RE_LIMITED_OPS ๊ฐ€ ์„ธํŒ…๋˜์—ˆ๋‹ค๋ฉด ์ด ๋น„ํŠธ๋Š” ์„ธํŒ…ํ•˜์ง€ ๋งˆ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

* RE_CHAR_CLASSES (๋ฌธ์ž ํด๋ž˜์Šค) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ์œผ๋ฉด ๋ฆฌ์ŠคํŠธ์•ˆ์—์„œ ๋ฌธ์žํด๋ž˜์Šค ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ 
์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

์œ„์—์„œ ์˜ˆ๋ฅผ ๋“ , egrep ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์ŠคํŠธ์•ˆ([..])์—์„œ ๋ฌธ์ž ํด๋ž˜์Šค ([:alnum:]) 
์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฏ€๋กœ ์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏธ๋ฃจ์–ด ์ง์ž‘ํ•  ์ˆ˜ ์žˆ 
์Šต๋‹ˆ๋‹ค. 

* RE_CONTEXT_INDEP_ANCHORS 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋ฉด, '^'์™€ '$'๋Š” ๋ฆฌ์ŠคํŠธ ๋ฐ–์—์„œ์˜ ์–ด๋””์—์„œ๋‚˜ ํŠน์ˆ˜๋ฌธ์ž 
๋กœ ์ทจ๊ธ‰ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํ™•์‹คํ•œ ๋ฌธ๋งฅ์—์„œ๋งŒ ํŠน์ˆ˜๋ฌธ์ž๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. 

* RE_CONTEXT_INDEP_OPS 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ์œผ๋ฉด, ๋ฆฌ์ŠคํŠธ ๋ฐ–์—์„œ ์–ด๋””์„œ๋˜์ง€ "ํ™•์‹คํ•œ ๋ฌธ์ž"๋“ค์€ ํŠน์ˆ˜ 
๋ฌธ์ž๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ž๋“ค์€ ๋‹จ์ง€ ์–ด๋–ค ๋ฌธ๋งฅ์—์„œ๋งŒ ํŠน์ˆ˜ 
๋ฌธ์ž์ด๊ณ  ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ๊ทธ๋ƒฅ๋ฌธ์ž๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์ง€ ์•Š 
์€ ์ƒํƒœ์˜ '*' ์™€ RE_LIMITED_OPS๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ '+'์™€ '?'(๋˜๋Š” 
RE_BK_PLUS_QM์ด ์„ค์ •๋˜์—ˆ์„ ๋•Œ์˜ '\+', '\?')๋Š”, ์ •๊ทœํ‘œํ˜„์‹์˜ ์ฒ˜์Œ(์˜ˆ:*foo) 
์ด๋‚˜ ์˜คํ”ˆ๊ทธ๋ฃน์—ฐ์‚ฐ์ž('(')๋‚˜ ๋Œ€์ฒด ์—ฐ์‚ฐ์ž('|')์˜ ๋ฐ”๋กœ๋’ค(์˜ˆ: (*.., |*)์— ์˜ค์ง€ 
์•Š์„ ๋•Œ์—๋งŒ ์ด๊ฒƒ์„ ๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. 

* RE_CONTEXT_INVALID_OPS 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ฐ˜๋ณต์˜คํผ๋ ˆ์ดํ„ฐ('*')์™€ ๋Œ€์ฒด์˜คํผ๋ ˆ์ดํ„ฐ('|')๋Š” 
์ •๊ทœํ‘œํ˜„์‹ ๋‚ด๋ถ€์—์„œ "ํ™•์‹คํ•œ ์œ„์น˜"์—๋Š” ์˜ฌ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ 
๊ฒฝ์šฐ์—๋Š” ์ •๊ทœํ‘œํ˜„์‹์ด ์ž˜ ๋ชป๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. 

O ๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋‹ค์Œ์˜ ์œ„์น˜์— ์˜ฌ๊ฒฝ์šฐ 
- ์ •๊ทœํ‘œํ˜„์‹์˜ ์ฒ˜์Œ์— ์˜ฌ๊ฒฝ์šฐ (์˜ˆ: '*[a-z]') 
- ๋ผ์ธ์˜ ์‹œ์ž‘ ์˜คํผ๋ ˆ์ดํ„ฐ ('^')๋‚˜ ์˜คํ”ˆ ๊ทธ๋ฃน ('(')์ด๋‚˜ ๋Œ€์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ('|') 
์˜ ๋ฐ”๋กœ๋’ค์— ์˜ค๋Š” ๊ฒฝ์šฐ (์˜ˆ: '^*', '(*..)', '|*') 

o ๋Œ€์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋‹ค์Œ์˜ ์œ„์น˜์— ์˜ฌ๊ฒฝ์šฐ 
- ์ •๊ทœํ‘œํ˜„์‹์˜ ์ฒ˜์Œ์ด๋‚˜ ๋งˆ์ง€๋ง‰์— ์˜ฌ๊ฒฝ์šฐ (์˜ˆ: '|foo', 'foo|') 
- ๋ผ์ธ์˜ ๋ ์˜คํผ๋ ˆ์ดํ„ฐ ('$')์˜ ๋ฐ”๋กœ ์ „์ด๋‚˜, ๋Œ€์ฒด์˜คํผ๋ ˆ์ดํ„ฐ, ์˜คํ”ˆ ๊ทธ๋ฃน 
์˜คํผ๋ ˆ์ดํ„ฐ์˜ ๋ฐ”๋กœ๋’ค์— ์˜ฌ๊ฒฝ์šฐ (์˜ˆ: '|$', '||', '(|') 

๋งŒ์ผ, ์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์ •๊ทœํ‘œํ˜„์‹์˜ ์–ด๋””์—์„œ๋˜์ง€ ๋ฐ˜๋ณต ์˜คํผ 
๋ ˆ์ดํ„ฐ์™€ ๋ฐ์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

* RE_DOT_NEWLINE (์  '.'์€ ๋‰ด๋ผ์ธ์„ ํฌํ•จ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋ฉด, "์•„๋ฌด๊ฑฐ๋‚˜ํ•œ๋ฌธ์ž ์˜คํผ๋ ˆ์ดํ„ฐ(match-any-character 
operator)" ('.')๋Š” ๋‰ด๋ผ์ธ๋ฌธ์ž์™€ ๋งค์นญ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธํŠธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด 
'.' ๋Š” ๋‰ด๋ผ์ธ๋ฌธ์ž('\n') ์™€ ๋งค์นญ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

* RE_DOT_NOT_NULL (์  '.'์€ ๋„์ด ๋  ์ˆ˜ ์—†๋‹ค) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋ฉด, ์•„๋ฌด๊ฑฐ๋‚˜ํ•œ๋ฌธ์ž ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋„๋ฌธ์ž์™€ ๋งค์นญ๋  ์ˆ˜ 
์—†์œผ๋ฉฐ, ์„ธํŠธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

* RE_INTERVALS (๊ฐ„๊ฒฉ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด Regex๋Š” "๊ฐ„๊ฒฉ์˜คํผ๋ ˆ์ดํ„ฐ(interval operators)" 
('{', '}')๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

* RE_LIMITED_OPS (์˜คํผ๋ ˆ์ดํ„ฐ ์ œํ•œ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋ฉด, Regex๋Š” ํ•˜๋‚˜์ด์ƒ ์˜คํผ๋ ˆ์ดํ„ฐ('+'๋˜๋Š” '\+')์™€ 
๋ปฅ๊ฐœ์ด์ƒ ์˜คํผ๋ ˆ์ดํ„ฐ('*')๋Š” ์ธ์‹์„ ํ•˜์ง€ ๋ชปํ•˜๋ฉฐ, ์„ธํŒ…๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๊ฐ€๋Šฅ 
ํ•ฉ๋‹ˆ๋‹ค. 

* RE_NEWLINE_ALT (๋‰ด๋ผ์ธ ๋Œ€์ฒด) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋‰ด๋ผ์ธ์€ ๋Œ€์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ์ทจ๊ธ‰๋˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค 
๋ฉด ๋‰ด๋ผ์ธ๋ฌธ์ž๋Š” ๊ทธ๋ƒฅ๋ฌธ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

* RE_NO_BK_BRACES (๋ฐฑ์Šฌ๋ž˜์‰ฌ ์—†๋Š” ์ค‘๊ด„ํ˜ธ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, '{'๋Š” ์˜คํ”ˆ ์ธํ„ฐ๋ฒŒ(open-interval)์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋˜ 
๊ณ , '}'๋Š” ํด๋กœ์ฆˆ ์ธํ„ฐ๋ฒŒ(close-interval) ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด 
, '\{'์™€ '\}'๊ฐ€ ๊ฐ๊ฐ ๊ทธ์—ญํ• ์„ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋น„ํŠธ๋Š” RE_INTERVALS๊ฐ€ ์„ธํŠธ๋˜ 
์–ด ์žˆ์„ ๋•Œ์—๋งŒ ์ƒ๊ด€์žˆ์Šต๋‹ˆ๋‹ค. 

* RE_NO_BK_PARENS (๋ฐฑ์Šฌ๋ž˜์‰ฌ ์—†๋Š” ์†Œ๊ด„ํ˜ธ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด '('๋Š” ์˜คํ”ˆ ๊ทธ๋ฃน ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋˜๊ณ , ')'๋Š” ํด๋กœ์ฆˆ 
๊ทธ๋ฃน ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, '\('์™€ 
'\)'๊ฐ€ ๊ฐ๊ฐ ๊ทธ์—ญํ• ์„ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค. 

* RE_NO_BK_REFS (๊ฑฐ๊พธ๋กœ์ฐธ์กฐ (^^ ์˜คํผ๋ ˆ์ดํ„ฐ ์ธ์‹์•ˆํ•จ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, Regex๋Š” '\'digit ์™€ ๊ฐ™์€ ๊ฑฐ๊พธ๋กœ์ฐธ์กฐ ์˜คํผ๋ ˆ์ดํ„ฐ 
๋ฅผ ์ธ์‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. 

* RE_NO_BK_VBAR (๋ฐฑ์Šฌ๋ž˜์‰ฌ ๋ง‰๋Œ€๊ธฐ ^^;๋ฅผ ์ธ์‹์•ˆํ•จ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด '|'๊ฐ€ ๋Œ€์ฒด์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ๋˜๊ณ , ์„ธํŠธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด 
,'\|'๊ฐ€ ๋Œ€์ฒด์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋น„ํŠธ๋Š” RE_LIMITED_OPS ๊ฐ€ ์„ธํŠธ๋˜์—ˆ๋‹ค๋ฉด 
์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. 

* RE_NO_EMPTY_RANGES (๋น„์–ด์žˆ์ง€ ์•Š๋Š” ๋ฒ”์œ„) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ •๊ทœํ‘œํ˜„์‹์—์„œ ์ž˜๋ชป๋œ ๋ฒ”์œ„์ง€์ •(์˜ˆ:'[z-a]') 
์‹œ์—๋Š” ํ‹€๋ฆฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, Regex๋Š” ๊ทธ ๋ฒ”์œ„๋ฅผ ๋‹จ 
์ง€ ํ……๋น„๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. 

* RE_UNMATCHED_RIGHT_PAREN_ORD (๋น ์ง„ ์˜ค๋ฅธ์ชฝ ๊ด„ํ˜ธ) 

์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์—ˆ๊ณ , ์ •๊ทœํ‘œํ˜„์‹์—์„œ ์˜คํ”ˆ๊ทธ๋ฃน ์˜คํผ๋ ˆ์ดํ„ฐ('(')๊ฐ€ ํด๋กœ์ฆˆ 
๊ทธ๋ฃน ์˜คํผ๋ ˆ์ดํ„ฐ์™€ ์ง์ด ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๋‚˜, ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋„ค๋Š” ')'๋ฅผ 
์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 


ํœด..์ด์ œ ์„ค๋ช…์„ ๋‹คํ–ˆ๊ตฐ์š”.. ๋ฌด์Šจ ๋œป์ธ์ง€๋Š” ์ง์ž‘์ด ๊ฐ€์‹ค๊ฒ๋‹ˆ๋‹ค. 

์ด์ œ ์ด๋Ÿฌํ•œ ๋ฌธ๋ฒ• ๋น„ํŠธ๋“ค์ด ๋ชจ์—ฌ ์–ด๋–ป๊ฒŒ ํ‘œ์ค€ ์‘์šฉํ”„๋กœ๊ทธ๋žจ๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๊ฒŒ 
์ ์šฉ๋˜๋Š” ์ง€ ์‚ดํŽด๋ณด์ง€์š”. 


2.2 ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ฌธ๋ฒ• 
--------------------- 

์ด๋ฒˆ์— ์‚ดํŽด๋ณผ ๊ฒƒ์€ "regex.h" ์—์„œ ์ •์˜๋œ ์ค‘์š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฌธ๋ฒ• ์Šคํƒ€์ผ 
์„ ์ •์˜ํ•ด๋‘” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ์ค€์ด ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€, GNU Emacs, POSIX Awk, 
traditional Awk, Grep, Egrep ๋“ฑ์ด๋ฉฐ, POSIX ๊ธฐ๋ณธ๊ณผ ํ™•์žฅ ์ •๊ทœํ‘œํ˜„์‹์ด ์ •์˜๋ฉ 
๋‹ˆ๋‹ค. 

#define RE_SYNTAX_EMACS 0 

#define RE_SYNTAX_AWK \ 
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ 
| RE_NO_BK_PARENS | RE_NO_BK_REFS \ 
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ 
| RE_UNMATCHED_RIGHT_PAREN_ORD) 

#define RE_SYNTAX_POSIX_AWK \ 
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) 

#define RE_SYNTAX_GREP \ 
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \ 
| RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ 
| RE_NEWLINE_ALT) 

#define RE_SYNTAX_EGREP \ 
(RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ 
| RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ 
| RE_NEWLINE_ALT | RE_NO_BK_PARENS \ 
| RE_NO_BK_VBAR) 

#define RE_SYNTAX_POSIX_EGREP \ 
(RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) 

/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ 
#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC 

#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC 

/* POSIX ๊ธฐ๋ณธ๋ฌธ๋ฒ•๊ณผ ํ™•์žฅ๋ฌธ๋ฒ•์—์„œ ๊ณตํ†ต๋˜๋Š” ๋ฌธ๋ฒ• */ 
#define _RE_SYNTAX_POSIX_COMMON \ 
(RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ 
| RE_INTERVALS | RE_NO_EMPTY_RANGES) 

#defineRE_SYNTAX_POSIX_BASIC \ 
(_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) 

/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes 
RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this 
isn't minimal, since other operators, such as \`, aren't disabled. */ 
#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ 
(_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) 

#define RE_SYNTAX_POSIX_EXTENDED \ 
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ 
| RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ 
| RE_NO_BK_PARENS | RE_NO_BK_VBAR \ 
| RE_UNMATCHED_RIGHT_PAREN_ORD) 

/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS 
replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ 
#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ 
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ 
| RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ 
| RE_NO_BK_PARENS | RE_NO_BK_REFS \ 
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) 


2.3 ๋ฐฑ์Šฌ๋ž˜์‰ฌ ๋ฌธ์ž 
------------------ 

'\'๋ฌธ์ž๋Š” 4๊ฐ€์ง€์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋Š” ํ˜„์žฌ์˜ ๋ฌธ๋งฅ๊ณผ 
์–ด๋–ค ๋ฌธ๋ฒ• ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋Š”๊ฐ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ ๋œป์€ 1) ๊ทธ๋ƒฅ๋ฌธ์ž, 2) 
๋‹ค์Œ๋ฌธ์ž๋ฅผ ์ธ์šฉํ•˜๋Š” ์—ญํ• , 3) ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋„์ž…ํ•˜๋Š” ์˜๋ฏธ, 4) ์•„๋ฌด๋œป ์—†์Œ 
์˜ ์˜๋ฏธ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 


1) ๋ฌธ๋ฒ• ๋น„ํŠธ๊ฐ€ RE_BACKSLASH_ESCAPE_IN_LISTS ๊ฐ€ ์„ธํŠธ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ฆฌ์Šค 
ํŠธ์•ˆ์— ์žˆ์„ ๋•Œ๋Š” ์ผ๋ฐ˜๋ฌธ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, '[\]'๋Š” '\'๊ณผ ๋งค์นญ์ด ๋ฉ 
๋‹ˆ๋‹ค. 

2) ์•„๋ž˜์— ์„ค๋ช…ํ•˜๋Š” ๋‘๊ฐ€์ง€ ์ค‘์˜ ํ•˜๋‚˜๋กœ ์‚ฌ์šฉ๋  ๋•Œ์—๋Š” ๋‹ค์Œ ๊ธ€์ž๋ฅผ ์ด์Šค์ผ€์ดํ”„ 
ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค์Œ๊ธ€์ž๊ฐ€ ํŠน์ˆ˜๋ฌธ์ž์ด๋ฉด ์ผ๋ฐ˜๋ฌธ์ž์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•ฉ๋‹ˆ 
๋‹ค. 

* ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ–์— ์žˆ์„ ๋•Œ 
* ๋ฆฌ์ŠคํŠธ์˜ ์•ˆ์— ์žˆ๊ณ  ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ RE_BACKSLASH_ESCAPE_IN_LISTS๊ฐ€ ์„ธํŠธ๋˜์–ด 
์žˆ์„ ๋•Œ 

3) ์–ด๋–ค ํŠน์ •ํ•œ ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜๊ณ  ํ™•์‹คํ•œ ์ผ๋ฐ˜๋ฌธ์ž๊ฐ€ ๋’ค๋”ฐ๋ผ ์˜ฌ๋•Œ ๊ทธ๊ฒƒ์€ 
์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ „๊ฐœํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ RE_BK_PLUS_QM, 
RE_NO_BK_BRACES, RE_NO_BK_VAR, RE_NO_BK_PARENS, RE_NO_BK_REF๋ฅผ ์ฐธ์กฐํ•˜์„ธ 
์š”. 

*'\b' ๋Š” ๋‹จ์–ด์—์„œ์˜ ๊ฒฝ๊ณ„๋ฅผ ์ง“๋Š” ๊ฒƒ๊ณผ ๋งค์นญ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* '\B' ๋Š” ๋‹จ์–ด๋‚ด๋ถ€์™€ ๋งค์นญ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* '\<' ๋Š” ๋‹จ์–ด์˜ ์‹œ์ž‘๊ณผ ๋งค์นญ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* '\>' ๋Š” ๋‹จ์–ด์˜ ๋๊ณผ ๋งค์นญ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* '\w' ๋Š” ๋‹จ์–ด์˜ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* '\W' ๋Š” ๋น„๋‹จ์–ด ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* '\'' ๋Š” ๋ฒ„ํผ์˜ ์‹œ์ž‘๊ณผ ๋งค์นญ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* '\'' ๋Š” ๋ฒ„ํผ์˜ ๋๊ณผ ๋งค์นญ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 
* Regex๊ฐ€ emacs ์‹ฌ๋ณผ๋กœ ์ •์˜๋œ ์ƒํƒœ๋กœ ์ „์ฒ˜๋ฆฌ๋˜์–ด ์ปดํŒŒ์ผ๋œ๋‹ค๋ฉด, '\sclass' 
๋Š” ๋ฌธ๋ฒ•์ƒ์˜ ํด๋ž˜์Šค์™€ ๋งค์นญ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , '\Sclass'๋Š” 
๋ฌธ๋ฒ•์ƒ ๋น„ ํด๋ž˜์Šค ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 

4) ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ์—, Regex ๋Š” '\'๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, '\n'์€ 'n' 
๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 


( ๋‹ค์Œ์‹œ๊ฐ„์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ์˜คํผ๋ ˆ์ดํ„ฐ์— 
๋Œ€ํ•ด์„œ ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ) 


๋ฒˆ ํ˜ธ : 616 
๊ฒŒ์‹œ์ž : ํ•œ๋™ํ›ˆ (ddoch ) 
๋“ฑ๋ก์ผ : 1997-05-26 01:36 
์ œ ๋ชฉ : [๊ฐ•์ขŒ] Regex (์ •๊ทœํ‘œํ˜„์‹) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (2) 

GNU REGEX (์ •๊ทœํ‘œํ˜„์‹) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ•์ขŒ (2) 
------------------------------------------- 

3. ๊ณตํ†ต์ ์ธ ์˜คํผ๋ ˆ์ดํ„ฐ 
----------------------- 

์˜คํผ๋ ˆ์ดํ„ฐ๋ผ ํ•จ์€ ์•ž์„œ๋„ ๋ง์”€๋“œ๋ ธ์ง€๋งŒ ์ •๊ทœํ‘œํ˜„์‹์—์„œ ์‚ฌ์šฉํ•˜๋Š” '*' ๋‚˜ '[' ๊ฐ™์€ 
๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ •๊ทœํ‘œํ˜„์‹์„ ์ง€์›ํ•˜๋Š” awk, sed, vi, emacs์—์„œ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์‚ฌ 
์šฉํ•ด๋ณด์‹  ๋ถ„์€ ์–ผ๋งˆ๋‚˜ ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ง€ ์ถฉ๋ถ„ํžˆ ๊ฒฝํ—˜ํ•ด๋ณด์…จ์„ 
๊ฒ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์œ ๋‹‰์Šค๋Š” ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ์—์„œ ํƒ์›”ํ•œ ๋Šฅ๋ ฅ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๊ณ , ์œ ๋‹‰์Šค์˜ 
์ด๋Ÿฐ ์žฅ์ ์„ ๋”ฐ์˜จ ๋ฆฌ๋ˆ…์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง€์›์„ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ •๊ทœ 
ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ง€์‹์€ ๋ฐ˜๋“œ์‹œ ์ตํ˜€๋‘์‹œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•œ๋‘๊ตฐ๋ฐ์˜ 
์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ๋ชจ๋“  ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉ 
ํ•˜๋Š” ํ…์ŠคํŠธ ํŒจํ„ด ๋งค์นญ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

์ผ๋ฐ˜์ ์œผ๋กœ vi์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์•ž๋ถ€๋ถ„์˜ ์šฐํŽธ๋ฒˆ 
ํ˜ธ๋ถ€๋ถ„๋งŒ์„ ๋ฌธ์„œ๋‚ด์—์„œ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ 
์Šต๋‹ˆ๋‹ค. 

100-011 ์„œ์šธ์‹œ ์ค‘๊ตฌ ์ถฉ๋ฌด๋กœ1๊ฐ€ 02 ์ถฉ๋ฌด๋กœ1๊ฐ€ 
100-012 ์„œ์šธ์‹œ ์ค‘๊ตฌ ์ถฉ๋ฌด๋กœ2๊ฐ€ 02 ์ถฉ๋ฌด๋กœ2๊ฐ€ 

:%s/^[0-9]*-[0-9]* // 
............... 

๋ฐ‘์— '..' ๋œ ๋ถ€๋ถ„์ด ์ •๊ทœํ‘œํ˜„์‹์ด๊ณ , ์ •๊ทœํ‘œํ˜„์‹์€ ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ 
๋ฉ๋‹ˆ๋‹ค. ๋Œ€์ฒด๋กœ, ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์€ ํ•˜๋‚˜๋งŒ์œผ๋กœ ๋œ ๊ฒƒ๋“ค(์˜ˆ: '*')๊ณผ '\'๋‹ค์Œ์— ํ•œ๊ธ€ 
์ž๊ฐ€ ๋”ฐ๋ผ์˜ค๋Š” ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, '('๋‚˜ '\('๋Š” ์˜คํ”ˆ๊ทธ๋ฃน ์˜คํผ๋ ˆ 
์ดํ„ฐ์ž…๋‹ˆ๋‹ค. (๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋ฌธ๋ฒ• ๋น„ํŠธ๊ฐ€ RE_BK_PARENS๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋Š” ๊ฐ€์— ๋”ฐ๋ผ 
๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.) 

๋Œ€๋ถ€๋ถ„์˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ฆฌ์ŠคํŠธ ('[', ']')์•ˆ์—์„œ๋Š” ๊ทธ ํŠน์ˆ˜ํ•œ ์˜๋ฏธ๋ฅผ ์ƒ์‹คํ•ฉ๋‹ˆ๋‹ค. 

๊ทธ๋Ÿผ, ์ด์ œ ๊ฐ๊ฐ์˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 


3.1 ์ž์‹ ์„ ๋งค์นญ์‹œํ‚ค๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ (๊ทธ๋ƒฅ๋ฌธ์ž ๋˜๋Š” ์ผ๋ฐ˜๋ฌธ์ž) 
---------------------------------------------------------- 

์ด๊ฒƒ์€ ๊ทธ๋ƒฅ ์ผ๋ฐ˜๋ฌธ์ž๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. 'f'๋Š” 'f'์™€ ๋งค์นญ๋˜์ง€ 'ff'์™€ ๋งค์นญ๋˜์ง€๋Š” ์•Š์Šต 
๋‹ˆ๋‹ค. 

3.2 ์•„๋ฌด๊ฑฐ๋‚˜ํ•œ๋ฌธ์ž ์˜คํผ๋ ˆ์ดํ„ฐ (.) 
---------------------------------- 

'.'์€ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ž ํ•œ๊ฐœ์™€ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— 
ํ•ด๋‹น๋ฌธ์ž๋Š” ๋งค์นญ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

๋‰ด๋ผ์ธ๋ฌธ์ž : ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ RE_DOT_NEWLINE์ด ์„ธํŒ…๋˜์–ด ์žˆ์ง€ ์•Š์„๋•Œ 
๋„ : ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ RE_DOT_NOT_NULL ์ด ์„ธํŠธ๋˜์–ด ์žˆ์„ ๋•Œ 

์˜ˆ) 'a.b'๋Š” 'acb', 'a.b', 'azb'๋“ฑ๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 

3.3 ์—ฐ๊ฒฐ ์˜คํผ๋ ˆ์ดํ„ฐ 
-------------------- 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋‘๊ฐœ์˜ ์ •๊ทœํ‘œํ˜„์‹, a์™€ b๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, 'ab'๋Š” 'a'๋‹ค์Œ์— 
๋ฐ”๋กœ 'b'๊ฐ€ ๋”ฐ๋ผ์˜ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ, ์ •๊ทœํ‘œํ˜„์‹ 'ab'๋Š” ์ •๊ทœํ‘œํ˜„์‹ 'a' 
์™€ 'b'๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์‚ฌ์‹ค ์—ฐ๊ฒฐ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๊ฐœ๋…์ ์œผ๋กœ๋งŒ ์žˆ์„ 
๋ฟ์ด์ง€ ์–ด๋–ค ํ˜•ํƒœ๋Š” ๋„๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตณ์ด, ํ˜•ํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ํ•˜๋ฉด, 'ab'์ค‘ 
'a'์™€ 'b'์‚ฌ์ด์˜ ๋นˆ๋ฌธ์ž(empty character)๊ฐ€ ์—ฐ๊ฒฐ ์˜คํผ๋ ˆ์ดํ„ฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

3.4 ๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ 
-------------------- 

๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ์ •๊ทœํ‘œํ˜„์‹ ์ค‘ ์–ด๋–ค ํ‘œํ˜„์‹์˜ ํ˜•ํƒœ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ 
์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ '*'(๋ปฅ๊ฐœ์ด์ƒ๋งค์นญ), '+'(ํ•œ๊ฐœ์ด์ƒ๋งค์นญ), '?'(๋ปฅ๊ฐœ๋‚˜ 
ํ•œ๊ฐœ๋งค์นญ), '{', '}'(ํŠน์ •ํ•œ ๋ฐ˜๋ณต ํšŸ์ˆ˜ ์ง€์ •-๊ฐ„๊ฒฉ์˜คํผ๋ ˆ์ดํ„ฐ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

3.4.1 ๋ปฅ๊ฐœ์ด์ƒ ๋งค์นญ ์˜คํผ๋ ˆ์ดํ„ฐ (*) (match-zero-or-more operator) 
----------------------------------- 

์ด ์—ฐ์‚ฐ์ž๋Š” ํ•ด๋‹น ์ŠคํŠธ๋ง์„ ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ๋งค์นญ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œํ•œ ๊ฐ€์žฅ์ ์€ 
๋ฐ˜๋ณตํšŸ์ˆ˜(0๋ฅผ ํฌํ•จํ•˜์—ฌ)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ น, ์˜ˆ๋ฅผ ๋“ค๋ฉด, 'o*' ๋Š” "0๊ฐœ ์ด์ƒ์œผ๋กœ 
๊ตฌ์„ฑ๋œ o"๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 'fo*'๋Š” 'fo'์˜ ๋ฐ˜๋ณต์ด ์•„๋‹ˆ๋ผ 'o'์˜ ๋ฐ˜๋ณต์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ 
๋‹ค. ๋”ฐ๋ผ์„œ, 'fo*'๋Š” 'f', 'fo', foo'๋“ฑ๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜ 
๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

* ์ •๊ทœํ‘œํ˜„์‹์˜ ์ฒ˜์Œ์— ์˜ฌ ๊ฒฝ์šฐ ('*foo') 
* ๋ผ์ธ์˜ ์‹œ์ž‘๊ณผ ๋งค์นญ๋˜๋Š” '^'๋‚˜, ์˜คํ”ˆ๊ทธ๋ฃน '('๋‚˜, ๋Œ€์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ์ธ '|' ๋ฐ”๋กœ 
๋‹ค์Œ์— ์œ„์น˜ํ•  ๊ฒฝ์šฐ ('^*', '(*foo)', 'foo|*bar') 

์œ„์˜ ๊ฒฝ์šฐ์— ์•„๋ž˜์˜ 3๊ฐ€์ง€ ๋‹ค๋ฅธ ์ผ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

* ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ RE_CONTEXT_INVALID_OPS ๊ฐ€ ์„ธํŠธ๋˜์—ˆ๋‹ค๋ฉด, ๊ทธ ์ •๊ทœํ‘œํ˜„์‹์€ ํ‹€๋ฆฐ๊ฒƒ 
์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. 
* RE_CONTEXT_INVALID_OPS ๊ฐ€ ์„ธํŠธ๋˜์ง€ ์•Š์•˜๊ณ , RE_CONTEXT_INDEP_OPS๊ฐ€ ์„ธํŠธ๋˜์—ˆ 
๋‹ค๋ฉด, '*'๋Š” ๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 
* ๋‹ค๋ฅธ๊ฒฝ์šฐ๋Š”, '*'๋Š” ๊ทธ๋ƒฅ๋ฌธ์ž(์ผ๋ฐ˜๋ฌธ์ž)์ž…๋‹ˆ๋‹ค. 

'*' ์˜ ์ž‘๋™์›๋ฆฌ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

'ca*ar' ์ด๋ผ๋Š” ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ 'caaar' ์ด๋ผ๋Š” ๋ฌธ์ž๋ฅผ ๋งค์นญ ์‹œํ‚จ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, 
'ca*ar' ์˜ 'a*' ๋Š” 'caaar'์˜ 'aaa'๋ฅผ ๋งค์นญ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์ง€๋ง‰ ์ „์ž์˜ 'ar' 
์ด ํ›„์ž์˜ ๋‚จ์€ 'r'์„ ๋งค์นญ ์‹œํ‚ค์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ 'a*' ๋กœ ๋งค์นญ๋œ 'aaa'์ค‘ 
๋งˆ์ง€๋ง‰ ํ•˜๋‚˜๋ฅผ ๊ฑฐ๊พธ๋กœ ๋ฐŸ์•„ 'a'๋ฅผ ์ทจ์†Œํ•จ์œผ๋กœ์จ 'ar'์„ ๋งค์นญ์‹œํ‚ต๋‹ˆ๋‹ค. 

1) ca*ar => caaar (match) 
^^^ ^^^^ 
2) ca*ar => caaar (not match) 
^^ ^ 
3) ca*ar => caaar (one back cancle) 
^^^ ^^^ 
4) ca*ar => caaar (match) 
---^^ ---^^ 


3.4.2 ํ•˜๋‚˜์ด์ƒ ์˜คํผ๋ ˆ์ดํ„ฐ (+ or \+) (match-one-or-more operator) 
----------------------------------- 

RE_LIMITED_OPS ๋กœ ์˜คํผ๋ ˆ์ดํ„ฐ ์ œํ•œ์„ ๊ฐ€ํ•˜๋ฉด, Regex ๋Š” ์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ธ์‹ 
ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ RE_BK_PLUS_QM ์ด ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋ฉด, '\+' ๊ฐ€ ๊ทธ ์—ญํ• ์„ ํ•˜๊ณ , 
์•„๋‹ˆ๋ฉด '+' ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

์ด๊ฒƒ์€ ์•ž์„œ์˜ ๋ปฅ๊ฐœ์ด์ƒ ์˜คํผ๋ ˆ์ดํ„ฐ ('*')์™€ ์ ์–ด๋„ ํ•˜๋‚˜๋Š” ๋งค์นญ์‹œํ‚จ๋‹ค๋Š” ์ ์„ ์ œ 
์™ธํ•˜๊ณ ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค. 

๊ฐ€๋ น, '+'๊ฐ€ ์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฉด, 'ca+r' ์€ 'car', 'caaaar'๊ณผ ๋งค์นญ๋˜๊ณ , 'cr'๊ณผ๋Š” 
๋งค์นญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

3.4.3 ๋ปฅ๊ฐœ๋‚˜ ํ•œ๊ฐœ ์˜คํผ๋ ˆ์ดํ„ฐ (? or \?) 
--------------------------------------- 

์ด๊ฒƒ๋„ ์—ญ์‹œ RE_LIMITED_OPS ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์•„์šธ๋Ÿฌ, 
RE_BK_PLUS_QM ์˜ ์„ธํŒ…์—ฌ๋ถ€์— ๋”ฐ๋ผ, '\?' ๋‚˜ '?'๊ฐ€ ๊ทธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ปฅ๊ฐœ์ด์ƒ์˜ ์˜คํผ๋ ˆ์ดํ„ฐ์™€ ํ•œ๊ฐœ๋‚˜ ํ•˜๋‚˜๋„ ๋งค์นญ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” 
์ ๋งŒ ์ œ์™ธํ•˜๋ฉด ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, 'ca?r'์€ 'car'๋‚˜ 'cr'์„ ๋งค์นญ์‹œํ‚ค๊ณ , 
๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๋งค์นญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

3.4.4 ๊ฐ„๊ฒฉ ์˜คํผ๋ ˆ์ดํ„ฐ ({...} ๋˜๋Š” \{...\}) (interval operator) 
------------------------------------------- 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํŠน์ • ํŒจํ„ด์˜ ์ถœํ˜„๋นˆ๋„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

RE_INTERVALS ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, Regex๋Š” ์ด๊ฒƒ์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ์•„์šธ๋Ÿฌ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ 
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€๋Šฅํ•œํ•œ ๊ฐ€์žฅ ์ ์€ ํšŸ์ˆ˜์˜ ๋ฐ˜๋ณต๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 

RE_NO_BK_BRACES ๊ฐ€ ์„ธํŠธ๋˜์—ˆ๋‹ค๋ฉด, '{', '}'๊ฐ€ ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, 
'\{'์™€ '\}'๊ฐ€ ์˜ค๋ŸฌํŽ˜์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

'{' ์™€ '}' ๊ฐ€ ํ˜„์žฌ์˜ ๊ฐ„๊ฒฉ ์˜คํผ๋ ˆ์ดํ„ฐ๋ผ๊ณ  ํ–ˆ์„ ๊ฒฝ์šฐ์—, ๋‹ค์Œ์˜ ๋œป์€ ๋‹ค์Œ๊ณผ ๊ฐ™ 
์Šต๋‹ˆ๋‹ค. 

* r{2,5} : 2๊ฐœ์—์„œ 5๊ฐœ ์‚ฌ์ด์˜ 'r' 
* r{2,} : 2๊ฐœ ์ด์ƒ์˜ 'r' 
* r{4} : ์ •ํ™•ํžˆ 4๊ฐœ์˜ 'r' 

๋‹ค์Œ์˜ ๊ฒฝ์šฐ์—๋Š” ํ‹€๋ฆฐ ๊ฒƒ์ด ๋ฉ๋‹ˆ๋‹ค. 

* ์ตœ์†Œํ•œ๊ณ„ ๊ฐฏ์ˆ˜๊ฐ€ ์ตœ๋Œ€ํ•œ๊ณ„ ๊ฐฏ์ˆ˜๋ณด๋‹ค ํด ๊ฒฝ์šฐ 
* ๊ฐ„๊ฒฉ ์˜คํผ๋ ˆ์ดํ„ฐ ์•ˆ์˜ ์ˆซ์ž๊ฐ€ RE_DUP_MAX ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ 

๋งŒ์•ฝ, ๊ฐ„๊ฒฉ ํ‘œํ˜„์‹์ด ์ž˜๋ชป ์ž‘์„ฑ๋˜์–ด ์žˆ๊ณ , ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ RE_NO_BK_BRACES ๊ฐ€ ์„ธํŠธ 
๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š”, Regex ๋Š” ๊ฐ„๊ฒฉ ์˜คํผ๋ ˆ์ดํ„ฐ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ž๋Š” ๊ทธ๋ƒฅ๋ฌธ์ž 
(์ผ๋ฐ˜๋ฌธ์ž)๋กœ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๊ทธ ์ •๊ทœํ‘œํ˜„์‹์€ 
์ง„์งœ๋กœ ํ‹€๋ฆฐ ๊ฒƒ์ด ๋ฉ๋‹ˆ๋‹ค. 

๋˜ํ•œ, ์ •๊ทœํ‘œํ˜„์‹์ด ์œ ํšจํ•˜๊ธด ํ•œ๋ฐ, ๊ฐ„๊ฒฉ ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์ž‘๋™ํ•  ๋Œ€์ƒ์ด ์—†์„ ๊ฒฝ์šฐ, 
RE_CONTEXT_INVALID_OPS ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ทธ ์ •๊ทœํ‘œํ˜„์‹์€ ํ‹€๋ฆฐ ๊ฒƒ์ด ๋ฉ๋‹ˆ๋‹ค. 
๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, Regex ๋Š” ๊ฐ„๊ฒฉ ์˜คํผ๋ ˆ์ดํ„ฐ ์•ˆ์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๊ทธ๋ƒฅ 
๋ฌธ์ž(์ผ๋ฐ˜๋ฌธ์ž)๋กœ ์žฌ๊ตฌ์„ฑํ•˜๋ฉฐ, ๋ฐฑ์Šฌ๋ž˜์‰ฌ๋Š” ๊ทธ๋ƒฅ ๋ฌด์‹œํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. 

flex ๋กœ ๊ฐ„๋‹จํžˆ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

..................................................................... 
queen:~/regex$ echo -e "%%\nx{5} printf(\"only five\\n\"); " | flex 
queen:~/regex$ gcc lex.yy.c -lfl 
queen:~/regex$ a.out 
xxxxx 
only five 

^D 
queen:~/regex$ 
..................................................................... 

3.5 ๋Œ€์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ (| or \|) (alternation operator) 
------------------------------ 

RE_LIMITED_OPS ๋กœ ์˜ค๋Ÿฌ๋ ˆ์ดํ„ฐ์— ์ œํ•œ์„ ๊ฐ€ํ•œ๋‹ค๋ฉด, Regex ๋Š” ์ด๊ฒƒ์„ ์ธ์‹ํ•˜์ง€ ์•Š 
์Šต๋‹ˆ๋‹ค. RE_NO_BK_VBAR ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, '|'๊ฐ€ ์ด๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค 
๋ฉด '\|'๊ฐ€ ์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 

๋Œ€์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ์ •๊ทœํ‘œํ˜„์‹ ์ค‘์˜ ํ•˜๋‚˜๋ฅผ ๋งค์นญ์‹œํ‚ต๋‹ˆ๋‹ค. 'foo|bar|quux'๋Š” 
'foo'๋‚˜ 'bar' ๋˜๋Š” 'quux'์™€ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 

๋ฐ์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋ฃน ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ 
์šฉํ•˜์—ฌ ๊ด„ํ˜ธ๋ฅผ ๋ฌถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, '(u|li)n(i|u)x' ๋Š” 'linux', 
'unix' ๋“ฑ๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 


3.6 ๋ฆฌ์ŠคํŠธ ์˜คํผ๋ ˆ์ดํ„ฐ ([...] and [^...]) 
----------------------------------------- 

๋ฆฌ์ŠคํŠธ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์•„์ดํ…œ์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์•„ 
์ดํ…œ์€ ๋ฌธ์ž(์˜ˆ: 'a'), ๋ฌธ์ž ํด๋ž˜์Šค ํ‘œํ˜„์‹(์˜ˆ: '[:digit:]'), ๋ฒ”์œ„ ํ‘œํ˜„์‹('-') 
์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์•ˆ์— ์–ด๋–ค ์•„์ดํ…œ์„ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๋Š” ๋ฌธ๋ฒ•๋น„ํŠธ 
์— ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋น„์–ด์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ('[]')๋Š” ํ‹€๋ฆฐ ๊ฒƒ์ด ๋ฉ๋‹ˆ๋‹ค. 

์—๋ฅผ ๋“ค๋ฉด, '[ab]'๋Š” 'a'๋‚˜ 'b'๋ฅผ ๋งค์นญ์‹œํ‚ค๊ณ , '[ad]*'๋Š” ๋นˆ๋ฌธ์ž์—ด์ด๋‚˜, 'a'๋‚˜ 
'b'๊ฐ€ ์•ž์„œ๋Š” ํ•œ๊ฐœ์ด์ƒ์˜ ๋ฌธ์ž์—ด๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 

์ด๊ฒƒ๊ณผ๋Š” ๋ฐ˜๋Œ€์˜ ์˜๋ฏธ๋ฅผ ์ง€๋‹ˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ '[..]'๊ฐ€๋ฆฌ์ŠคํŠธ ์•ˆ์˜ ํ•˜๋‚˜ 
๋ฅผ ๋งค์นญ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ผ๋ฉด '[^...]'๋Š” ๋ฆฌ์ŠคํŠธ์•ˆ์˜ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์™€ ๋งค์นญ 
๋ฉ๋‹ˆ๋‹ค. '^'๋Š” "๋ผ์ธ์˜ ์ฒ˜์Œ"์ด๋ผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์— ์˜ค๋ฉด, 
์ดํ›„์˜ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์™€ ๋งค์นญ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ์˜ ์˜ˆ์ œ์—์„œ๋„ 
์‚ดํŽด๋ณด์•˜์ง€๋งŒ, '[^a-zA-Z]'๋Š” ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์™€ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. ์•„์šธ๋Ÿฌ, 
์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—, ๋ฆฌ์ŠคํŠธ์•ˆ์—์„œ๋Š” ํŠน์ˆ˜๋ฌธ์ž๋“ค์ด ๊ทธ ์˜๋ฏธ๋ฅผ ์ƒ์‹คํ•œ๋‹ค๊ณ  ์•ž์—์„œ ๋ง 
์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, '[.*]'๋Š” ๋ณดํ†ต '.'๋‚˜ '*' ๋ฌธ์ž๋ฅผ ๋งค์นญ์‹œํ‚ต๋‹ˆ๋‹ค. 

์กฐ๊ธˆ์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค. 

']' : ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ซ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ '[' ๋‹ค์Œ์— ']' ๊ฐ€ ๋ฐ”๋กœ์˜ค๋ฉด ๊ทธ๋ƒฅ 
๋ฌธ์ž์ž…๋‹ˆ๋‹ค. 
'\' : RE_BACKSLASH_ESCAPE_IN_LISTS ๋ฌธ๋ฒ• ๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ๋ฌธ์ž๋ฅผ 
์ด์Šค์ผ€์ดํ”„ ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 
'[:' : RE_CHAR_CLASSES ๊ฐ€ ์„ธํŠธ๋˜๊ณ  ๊ทธ๋’ค์— ๋ฌธ๋ฒ•์— ๋งž๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์ด ๋”ฐ๋ผ 
์˜จ๋‹ค๋ฉด ๋ฌธ์ž ํด๋ž˜์Šค ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 
':]' : ๋ฌธ์ž ํด๋ž˜์Šค๋ฅผ ๋‹ซ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 
'-' : ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์— ์˜ค์ง€ ์•Š๊ณ  (์˜ˆ: '[-.]'), ๋ฒ”์œ„์ง€์ •์—์„œ ๋ ํฌ์ธํ„ฐ์— ์˜ค์ง€ 
์•Š๋Š” ๋‹ค๋ฉด(์˜ˆ: '[a--]') ๋ฒ”์œ„ ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 

3.6.1 ๋ฌธ์ž ํด๋ž˜์Šค ์˜คํผ๋ ˆ์ดํ„ฐ ([:...:]) (character class operators) 
--------------------------------------- 

์ด๊ฒƒ์€, ์œ ์‚ฌํ•œ ์„ฑ๊ฒฉ์˜ ๋ฌธ์ž๋“ค์„ ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ๋‹จ์–ด๋กœ ๊ทธ๋ฃน์„ ์ง€์–ด์„œ 
์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. C ์—์„œ์˜ isdigit, isalpha ๋“ฑ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ฐ€๋ น, '[[:alnum:]]'์€ '[a-zA-Z0-9]' ์™€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€์ง€์š”. 
์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

alnum : ์•ŒํŒŒ๋ฒณ๊ณผ ์ˆซ์ž 
alpha : ์•ŒํŒŒ๋ฒณ 
blank : ์ŠคํŽ˜์ด์Šค๋‚˜ ํƒญ (์‹œ์Šคํ…œ์— ์˜์กด์ ์ž„) 
cntrl : ์•„์Šคํ‚ค์ฝ”๋“œ์—์„œ์˜ 127 ์ด์ƒ์˜ ๋ฌธ์ž์™€ 32 ์ดํ•˜์˜ ์ œ์–ด๋ฌธ์ž 
(ํ•œ๊ธ€์˜ ์ฒซ์งธ๋ฐ”์ดํŠธ๊ฐ€ 127 ์ด์ƒ์ด๋ฏ€๋กœ ์ œ์–ด๋ฌธ์ž๋กœ ์ทจ๊ธ‰๋จ ) 
digit : ์ˆซ์ž 
graph : ์ŠคํŽ˜์ด์Šค๋Š” ์ œ์™ธ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” 'print' ํ•ญ๋ชฉ๊ณผ ๊ฐ™์Œ. 
lower : ์†Œ๋ฌธ์ž 
print : ์•„์Šคํ‚ค์ฝ”๋“œ์—์„œ 32์—์„œ 126๊นŒ์ง€์˜ ์ฐ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž 
punct : ์ œ์–ด๋ฌธ์ž๋„ ์•„๋‹ˆ๊ณ  ์•ŒํŒŒ๋ฒณ.์ˆซ์ž๋„ ์•„๋‹Œ ๋ฌธ์ž 
space : ์ŠคํŽ˜์ด์Šค, ์ผ€๋ฆฌ์ง€ ๋ฆฌํ„ด, ๋‰ด๋ผ์ธ, ์ˆ˜์ง ํƒญ, ํผํ”ผ๋“œ 
upper : ๋Œ€๋ฌธ์ž 
xdigit : 16์ง„์ˆ˜, 0-9, a-f, A-F 

ํด๋ž˜์Šค ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์—์„œ๋งŒ (์˜ˆ: '[[:digit:]]') ํšจ๋ ฅ์„ ๋ฐœํœ˜ํ•˜๊ณ , 
๊ทธ๋ƒฅ '[:digit:]' ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

3.6.2 ๋ฒ”์œ„ ์˜คํผ๋ ˆ์ดํ„ฐ (-) (range operator) 
-------------------------- 

๋ฒ”์œ„ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋ฉฐ, '-'๋ฅผ ์•ž๋’ค๋กœ ํ•œ ๋‘๋ฌธ์ž์‚ฌ์ด์˜ 
๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ น, 'a-f'๋Š” 'a'์—์„œ 'f'์‚ฌ์ด์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ํฌํ•จ 
ํ•ฉ๋‹ˆ๋‹ค. 

์ฃผ์˜) ๋ฌธ์ž ํด๋ž˜์Šค๋Š” ๋ฒ”์œ„์—์„œ ์‹œ์ž‘๊ณผ ๋ํฌ์ธํ„ฐ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ 
ํ•˜๋‚˜์˜ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž๊ทธ๋ฃน์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ฃ . 

์ž˜๋ชป๋œ ๊ฒฝ์šฐ : '[[:digit:]-[:alpha:]]' 

์ด์™ธ์—, ์•ฝ๊ฐ„์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

RE_NO_EMPTY_RANGES๊ฐ€ ์„ธํŠธ๋˜์—ˆ๊ณ , ๋ฒ”์œ„์˜ ๋ ํฌ์ธํ„ฐ๊ฐ€ ์‹œ์ž‘ํฌ์ธํ„ฐ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด, 
(์˜ˆ: '[z-a]') ๊ทธ๊ฒƒ์€ ํ‹€๋ฆฐ ๊ฒƒ์ด ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค 
๋ฉด, ๊ทธ ๋ฒ”์œ„๋Š” ํ…… ๋น„๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋งŒ์ผ '-'๋ฌธ์ž๋ฅผ ์›๋ž˜์˜ ๋ฌธ์ž์˜๋ฏธ๋กœ ๋ฆฌ์ŠคํŠธ์•ˆ์— 
๋„ฃ์„๋ ค๋ฉด, ๋‹ค์Œ ์ค‘ ํ•œ๊ฐ€์ง€๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

* ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ถ€๋ถ„์ด๋‚˜ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…ํ•œ๋‹ค. 
* ๋ฒ”์œ„์˜ ์‹œ์ž‘ํฌ์ธํ„ฐ๊ฐ€ '-'๋ณด๋‹ค ์ž‘๊ฒŒ ํ•˜๊ณ , ๋ํฌ์ธํ„ฐ๋ฅผ '-'์™€ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๊ฒŒ ํ•œ๋‹ค. 

์—๋ฅผ ๋“ค์–ด, '[-a-z]'๋Š” ์†Œ๋ฌธ์ž๋‚˜ '-'๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 


3.7 ๊ทธ๋ฃนํ™” ์˜คํผ๋ ˆ์ดํ„ฐ ((...) or \(...\)) (grouping operators) 
----------------------------------------- 

Regex ์—์„œ๋Š” ๊ทธ๋ฃน์„ ํ•˜๋‚˜์˜ ๋ณด์กฐ ํ‘œํ˜„์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ˆ˜ํ•™์—ฐ์‚ฐ์—์„œ 
'(a*(b-c)+d)/e' ์™€ ๊ฐ™์ด ๋ง์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ”๊นฅ์ชฝ ๊ด„ํ˜ธ๋ถ€ํ„ฐ ๊ทธ๋ฃน1๋ฒˆ, ์•ˆ์ชฝ ๊ด„ 
ํ˜ธ('(b-c)')๊ฐ€ ๊ทธ๋ฃน2๋ฒˆ์ด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ, ๋ฐ”๊นฅ์ชฝ์—์„œ ์•ˆ์ชฝ์œผ 
๋กœ ๊ทธ๋ฃน์˜ ์ˆœ์„œ๊ฐ€ ๋งค๊ฒจ์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž ์‹œ๋’ค์— ์„ค๋ช…ํ•  "๊ฑฐ๊พธ๋กœ ์ฐธ์กฐ(ํ›„์ง„์ฐธ์กฐ)" 
์˜คํผ๋ ˆ์ดํ„ฐ์— ์˜ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์—ฐ์‚ฐ์‹ ๋“ฑ์—์„œ ๊ด„ํ˜ธ๊ฐ€ ์—ฐ์†์œผ๋กœ ๋‚˜์˜ฌ๊ฒฝ์šฐ, 
C์˜ ํŒŒ์‹ฑ์—์„œ๋„ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ๊ด„ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ, ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์˜ ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

* ๋Œ€์ฒด์˜คํผ๋ ˆ์ดํ„ฐ ('|')๋‚˜ ๋ฐ˜๋ณต์˜คํผ๋ ˆ์ดํ„ฐ ('+'๋‚˜ '*')์—์„œ ์ธ์ž์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ • 
ํ•ฉ๋‹ˆ๋‹ค. 
* ์ฃผ์–ด์ง„ ๊ทธ๋ฃน๊ณผ ๋งค์นญ๋˜๋Š” ๋ณด์กฐ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค์˜ ์ž์ทจ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. 
์ด ๊ทธ๋ฃน์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, 
* "๊ฑฐ๊พธ๋กœ์ฐธ์กฐ" (back-reference)์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
* ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด ๋ถ€๋ถ„๋“ค์€ ๋‚˜์ค‘์— ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ RE_NO_BK_PARENS ๊ฐ€ ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, '('์™€ ')'๊ฐ€ ๊ทธ ์—ญํ• ์„ ํ•˜๋ฉฐ, 
์•„๋‹ˆ๋ฉด, '\('์™€ '\)'๊ฐ€ ๊ทธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. RE_UNMATCHED_RIGHT_PAREN_ORD ๊ฐ€ ์„ธ 
ํŠธ๋˜์–ด ์žˆ๊ณ , '('๋Š” ์žˆ๋Š” ๋ฐ ')'๊ฐ€ ์—†๋‹ค๋ฉด, ')'๊ฐ€ ๋งค์นญ๋œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋„˜์–ด 
๊ฐ‘๋‹ˆ๋‹ค. 

3.8 ๊ฑฐ๊พธ๋กœ์ฐธ์กฐ ์˜คํผ๋ ˆ์ดํ„ฐ (\์ˆซ์ž) (back-reference operator) 
---------------------------------- 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ์‚ฌ์‹ค, ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋น„์Šทํ•œ ํŒจํ„ด์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋‚˜์˜ฌ๊ฒฝ์šฐ์— 
์ƒ๋‹นํ•œ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

RE_NO_BK_REF ๋ฌธ๋ฒ• ๋น„ํŠธ๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. 
๊ฑฐ๊พธ๋กœ์ฐธ์กฐ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ์ด๋ฏธ ๊ธฐ์ˆ ํ•œ ์•ž์˜ ๊ทธ๋ฃน์„ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 
์ •๊ทœํ‘œํ˜„์‹ ์ค‘ '์ˆซ์ž' ๊ทธ๋ฃน์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” '\์ˆซ์ž'ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
์ˆซ์ž๋Š” '1'์—์„œ '9'๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๊ฒƒ์€ ์ฒ˜์Œ์˜ 1์—์„œ 9๊นŒ์ง€์˜ ๊ทธ๋ฃน๊ณผ ๋งค 
์นญ๋ฉ๋‹ˆ๋‹ค. 

์กฐ๊ธˆ๋” ์„ธ๋ถ€์ ์ธ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

* '(a)\1' ์€ 'aa'์™€ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. '\1'์€ ์ฒซ๋ฒˆ์งธ ๊ทธ๋ฃน์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, '(a)'๋กœ ๊ด„ํ˜ธ 
๋กœ ๋‘˜๋Ÿฌ์Œˆ์œผ๋กœ์จ ๊ทธ๋ฃน์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, '(bana)na\1bo\1'์€ 
'bananabanabobana'์™€ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 

* ์กฐ๊ธˆ ๋ณต์žกํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ ๋“ฑ์˜ ์ž‘๋™์œผ๋กœ ๊ทธ๋ฃน์ด 
ํ•œ๋ฒˆ ์ด์ƒ ๋งค์นญ์ด ๋  ๊ฒฝ์šฐ ๊ฑฐ๊พธ๋กœ์ฐธ์กฐ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋งค์นญ๋œ ๋ณด์กฐ 
๋ฌธ์ž์—ด์„ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ๋ง๋กœ๋งŒ ํ•˜๋ฉด ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋ฏ€๋กœ, '((a*)b)*\1\2' ์™€ 
'aabababa'์™€์˜ ๋งค์นญ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ ธ๋ณผ๊นŒ์š”?  ์ด๊ฒŒ ์‚ฐ์ˆ ์—ฐ์‚ฐ์‹์ด๋ฉด ์–ผ๋งˆ๋‚˜ ์ข‹๊ฒ  
์Šต๋‹ˆ๊นŒ๋งˆ๋Š” ์•ˆํƒ€๊น๊ฒŒ๋„ ์ •๊ทœํ‘œํ˜„์‹์ด๋‹ˆ๋งŒํผ ์กฐ๊ธˆ ํ–‡๊ฐˆ๋ฆฌ๋”๋ผ๋„ ์ž˜ ์‚ดํŽด๋ณด๋ฉด ๊ทธ 
๋ฆฌ ์–ด๋ ต์ง€๋งŒ์€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด„ํ˜ธ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ทธ๋ฃน์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. 

1๋ฒˆ ๊ทธ๋ฃน 
+------+ 
....... | 
'((a*)b)*\1\2' 
.... | 
+--------+ 
2๋ฒˆ ๊ทธ๋ฃน 

๋งค์นญ๋˜๋Š” ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค. '--' ๋Š” ๋งค๋‹จ๊ณ„์—์„œ ์„œ๋กœ ๋งค์นญ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. 

1) ((a*)b)*\1\2 aabababa 
------- --- 
2) ((a*)b)*\1\2 aabababa 
- -- 
3) ((a*)b)*\1\2 aabababa 
-- -- 
4) ((a*)b)*\1\2 aabababa 
-- - 

์—ฌ๊ธฐ์„œ ์ƒ๊ฐํ•ด์•ผ ํ• ์ ์€ 3)๋‹จ๊ณ„์˜ '\1'์€ 1๋‹จ๊ณ„์˜ '((a*)b)'์™€ ๋งค์นญ๋˜๋‚˜, ์ด๊ฒƒ์€ 
๋˜ํ•œ 2)๋‹จ๊ณ„์˜ '*' ๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ์— ์˜ํ•ด '*'(ab)์™€ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ตœ์ข… 
์ ์œผ๋กœ '\1'์€ 'ab'์™€ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 
๋ฌผ๋ก  ์œ„์˜ ํ‘œํ˜„์‹์€ 'aababa'์™€๋„ ๋งค์นญ์ด ๋ฉ๋‹ˆ๋‹ค. 

.................................................................... 
queen:~/regex$ echo "aabababa" | egrep "((a*)b)*\1\2" 
aabababa 
queen:~/regex$ echo "aababa" | egrep "((a*)b)*\1\2" 
aababa 
.................................................................... 

* '(one()|two())-and-(three\2|four\3)' ์€ 'one-and-three' ์™€ 'two-and-four' 
์™€ ๋งค์นญ์ด ๋˜์ง€, 'one-and-four'์™€ 'two-and-three'์™€๋Š” ๋งค์นญ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 
์—ฌ๊ธฐ์—์„œ, ๋จผ์ € 'one-and-' ๋ถ€๋ถ„๊นŒ์ง€ ๋งค์นญ์ด ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด, ๋‘๋ฒˆ์งธ ๊ทธ๋ฃน(one 
์˜†์˜ ๊ด„ํ˜ธ)์€ ๋นˆ๋ฌธ์ž์—ด๊ณผ ๋งค์นญ์ด ๋˜์—ˆ๊ณ , ์„ธ๋ฒˆ์งธ ๊ทธ๋ฃน(two์˜†์˜ ๊ด„ํ˜ธ)๋Š” ๋งค์นญ์— 
๊ด€์—ฌํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ์ƒํ™ฉ์—์„œ 'four'๊ฐ€ ๋งค์นญ์ด ๋  ๊ฒฝ์šฐ, Regex ๋Š” ๊ทธ๋ฃน 
3์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฑฐ๊พธ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ๊ทธ๋ฃน3์€ ๋งค์นญ์— ๊ด€์—ฌํ•˜์ง€ 
์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋งค์นญ์€ ์‹คํŒจ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. 

๊ฑฐ๊พธ๋กœ์ฐธ์กฐ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์ธ์ž๋กœ ์“ธ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, 
'(a(b))\2*'๋Š” 'a'๋‹ค์Œ์— 'b'๊ฐ€ ํ•˜๋‚˜์ด์ƒ ์˜ค๋Š” ๊ฒƒ๊ณผ ๋งค์นญ์ด ๋ฉ๋‹ˆ๋‹ค. ์•„์šธ๋Ÿฌ, 
'(a(b))\2{3}' ์€ 'abbbb'์™€ ๋งค์นญ์ด ๋ฉ๋‹ˆ๋‹ค. 

๋‹น์—ฐํžˆ, n๋ฒˆ์งธ์˜ ๋ณด์กฐํ‘œํ˜„์ด ์—†๋‹ค๋ฉด ๋งค์นญ์€ ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 
์žฌ๋ฏธ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ^^ 


3.9 ๋‹ป ์˜คํผ๋ ˆ์ดํ„ฐ (^, $) (anchoring operators) 
------------------------- 

๋‹ป ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ์ „์ฒด ๋ฌธ์ž์—ด์ด๋‚˜ ํ•˜๋‚˜์˜ ๋ผ์ธ์—์„œ ์‹œ์ž‘๊ณผ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ๋“ค์ž… 
๋‹ˆ๋‹ค. 

3.9.1 ๋ผ์ธ์˜ ์‹œ์ž‘ ์˜คํผ๋ ˆ์ดํ„ฐ (^) 
-------------------------------- 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘์ด๋‚˜ ๋‰ด๋ผ์ธ ๋ฌธ์ž ๋‹ค์Œ์˜ ๋นˆ๋ฌธ์ž์—ด์™€ ๋งค์นญํ•  ์ˆ˜ ์žˆ 
์Šต๋‹ˆ๋‹ค. 

๋‹ค์Œ์˜ ๊ฒฝ์šฐ์— '^'๋Š” ์ด ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์—ญํ• ์„ ํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ๋ฌธ์ž๊ฐ€ ๋ฉ 
๋‹ˆ๋‹ค. 

* '^' ์ด ํŒจํ„ด์—์„œ ์ฒ˜์Œ์— ์œ„์น˜ํ•œ๋‹ค. ๊ฐ€๋ น, '^foo' ๊ฐ™์€ ๊ฒฝ์šฐ 
* ๋ฌธ๋ฒ•๋น„ํŠธ๊ฐ€ RE_CONTEXT_INDEP_ANCHORS ๊ฐ€ ์„ธํŠธ๋˜์—ˆ๊ณ , ๊ณจํ˜ธ๋‚˜ ๊ทธ๋ฃน..๋“ฑ์˜ ๋ฐ–์— 
์žˆ์„ ๊ฒฝ์šฐ 
* ์˜คํ”ˆ๊ทธ๋ฃน์ด๋‚˜ ๋Œ€์ฒด ์˜คํผ๋ ˆ์ดํ„ฐ ๋‹ค์Œ์— ๋”ฐ๋ผ์˜ฌ ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด, 'a\(^b\)', 
'a\|^b' 

์ด๋Ÿฌํ•œ ๊ทœ์น™์€ '^' ๋ฅผ ํฌํ•จํ•˜๋Š” ์œ ํšจํ•œ ํŒจํ„ด์ด๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ๋งค์นญ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ 
์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ํŒจํ„ด ๋ฒ„ํผ์—์„œ newline_anchor ํ•„๋“œ๊ฐ€ ์„ธํŠธ๋˜์—ˆ๋‹ค๋ฉด, '^' 
๋Š” ๋‰ด๋ผ์ธ ๋‹ค์Œ๊ณผ์˜ ๋งค์นญ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€๋” ์ „์ฒด ๋ฌธ์ž์—ด์„ ๋ผ์ธ์œผ๋กœ ๋‚˜ 
๋ˆ„์–ด์„œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์„ ๋•Œ์— ์œ ์šฉํ•˜๋‹ค๊ณ  ํ•˜๋Š”๊ตฐ์š”. 

3.9.2 ๋ผ์ธ์˜ ๋ ์˜คํผ๋ ˆ์ดํ„ฐ ($) 
------------------------------- 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด์˜ ๋์ด๋‚˜ ๋‰ด๋ผ์ธ ๋ฌธ์ž์˜ ์ด์ „์˜ ๋นˆ ๋ฌธ์ž์—ด๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 
์ด๊ฒƒ์€ ํ•ญ์ƒ '$'๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, 'foo$'๋Š” 'foo\nbar'์˜ ์ฒ˜์Œ ์„ธ๊ธ€์ž 
์™€ ๋งค์นญ์ด ๋ฉ๋‹ˆ๋‹ค. 

(๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” GNU ์˜คํผ๋ ˆ์ดํ„ฐ์™€ GNU emacs ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ž ๊น ์‚ดํŽด๋ณด๊ณ  ์žฌ๋ฏธ 
์žˆ๋Š” Regex ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋“ค์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.) 

๋ฒˆ ํ˜ธ : 617 
๊ฒŒ์‹œ์ž : ํ•œ๋™ํ›ˆ (ddoch ) 
๋“ฑ๋ก์ผ : 1997-05-26 19:42 
์ œ ๋ชฉ : [๊ฐ•์ขŒ] Regex (์ •๊ทœํ‘œํ˜„์‹) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (3) 

GNU REGEX (์ •๊ทœํ‘œํ˜„์‹) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ•์ขŒ (3) 
------------------------------------------- 

4. GNU ์˜คํผ๋ ˆ์ดํ„ฐ 
------------------ 

์ด ์žฅ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ POSIX์—๋Š” ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋‚˜ GNU ์— ์˜ํ•ด ์ •์˜๋œ ์˜คํผ 
๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 

4.1 ์›Œ๋“œ ์˜คํผ๋ ˆ์ดํ„ฐ (word operators) 
-------------------- 

์—ฌ๊ธฐ์— ๋‚˜์˜ค๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” Regex ๊ฐ€ ๋‹จ์–ด๋“ค์˜ ์ผ๋ถ€๋ถ„์„ ์ธ์‹ํ•ด์•ผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 
Regex ๋Š” ์–ด๋А ๋ฌธ์ž๊ฐ€ ๋‹จ์–ด์˜ ์ผ๋ถ€๋ถ„์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ” 
์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

์‚ฌ์‹ค, ํ…์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด ๋‹จ์–ด๋‹จ์œ„๋กœ ํ•˜์—ฌ์•ผ ํ•  ์ž‘์—…์ด 
๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ‘œ์ค€ POSIX์—์„œ๋Š” ๋‹จ์–ด(์›Œ๋“œ)๋‹จ์œ„์˜ ์ž‘์—…์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ 
์ง€์›๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ทœ์ •๋œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ GNU ์—์„œ๋Š” ์“ธ๋งŒํ•œ ์›Œ๋“œ ๋‹จ์œ„์˜ 
์ž‘์—…์„ ์œ ์šฉํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ง€์›ํ•จ์œผ๋กœ์จ ์ •๊ทœํ‘œํ˜„์‹ 
์„ ์ข€๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์›Œ๋“œ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋งŽ์ด ์‚ฌ 
์šฉ๋˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ ํ™œ์šฉ์„ ์ž˜ ํ•˜๋ฉด ์•„์ฃผ ๋˜‘๋˜‘ํ•œ ์ผ์„ ๋งŽ์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

4.1.1 ์ด๋งฅ์Šค๊ฐ€ ์•„๋‹Œ ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ” (non-emacs syntax tables) 
-------------------------------- 

๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”์€ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์„ธํŠธ์˜ ๋ฌธ์ž๋“ค์— ์˜ํ•ด ์ธ๋ฑ์Šคํ™”๋œ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์ž… 
๋‹ˆ๋‹ค. Regex ๋Š” ํ•ญ์ƒ ์ด ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ char * ๋ณ€์ˆ˜๊ฐ’์„ 
์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ๊ฒฝ์šฐ์—๋Š” ์ด ๋ณ€์ˆ˜๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ดˆ๊ธฐํ™” 
์‹œํ‚ฌ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

* Regex ๊ฐ€ ์ „์ฒ˜๋ฆฌ ์‹ฌ๋ณผ emacs ๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๊ณ , SYNTAX_TABLE ์ด ๋‘˜๋‹ค ์ •์˜๋˜ 
์ง€ ์•Š์•˜๋‹ค๋ฉด, Regex ๋Š” re_syntax_table ์„ ํ• ๋‹นํ•˜๊ณ  i๊ฐ€ ๊ธ€์ž์ด๊ฑฐ๋‚˜ ์ˆซ์ž, 
'_' ์ด๋ผ๋ฉด, ์›์†Œ i๋‚˜ SWord๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. i๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ 0์œผ๋กœ 
์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. 
* Regex ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€emacs๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋‚˜ SYNTAX_TABLE ์ด ์ •์˜๋˜์—ˆ๋‹ค 
๋ฉด ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ char * ๋ณ€์ˆ˜ re_syntax_table ์„ ์œ ํšจํ•œ ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”(syntax 
table)๋กœ ์ •์˜ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
* Regex๊ฐ€ ์ „์ฒ˜๋ฆฌ ์‹ฌ๋ณผ emacs๊ฐ€ ์ •์˜๋œ ์ƒํƒœ์—์„œ ์ปดํŒŒ์ผ๋˜์—ˆ๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด 
๋‚˜๋Š” ์ง€๋Š” ๋’ค์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. 

4.1.2 Match-word-boundary Operator (\b) 
---------------------------------------- 

'\b' ๋Š” ๋‹จ์–ด๋ฅผ ๊ตฌ๋ถ„์ง“์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ ๋‹จ์–ด์˜ ์‹œ์ž‘๊ณผ ๋์˜ ๋นˆ ๋ฌธ์ž์—ด๊ณผ ๋งค์นญ 
์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, '\brat\b'๋Š” ๋ถ„๋ฆฌ๋œ ๋‚ฑ๋ง, 'rat'์„ ๋งค์นญ์‹œํ‚ต๋‹ˆ๋‹ค. 
๊ทธ๋Ÿฌ๋‚˜,๋‹จ์–ด์˜ ๋ฒ”์œ„๋ฅผ ์–ด๋–ป๊ฒŒ ๊ทœ์ •ํ•˜๋Š”๊ฐ€ ํ•˜๋Š” ๊ฒƒ์€ ๋ช‡๊ฐ€์ง€ ์˜ˆ์ œ๋กœ ์ถฉ๋ถ„ํžˆ ์œ ์ถ” 
ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์ด ๊ฐ•์ขŒ์˜ ์ฒ˜์Œ์— ๋“  ์˜ˆ๋ฅผ, ์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. 

.................................................................. 
grep "\bint\b" regex.c 

mcnt = (int) Sword; 
int mcnt; 
......... 
queen:~/regex$ 
.................................................................. 

์œ„์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณผ ๋•Œ, ๋‹จ์–ด๋Š” "๊ณต๋ฐฑ๋ฌธ์ž(ํ™”์ดํŠธ๋ฌธ์ž)๋‚˜ ๋ถ€ํ˜ธ๋ฌธ์ž('(', ']', '-', 
..) ๊ฐ€ ๋ผ์–ด๋“ค์ง€ ์•Š๋Š” ๋ฌธ์ž์˜ ์—ฐ์†๋œ ์ง‘ํ•ฉ" ์ •๋„๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

4.1.3 Match-within-word Operator (\B) 
---------------------------------------- 

'B' ๋Š” ๋‚ฑ๋ง์•ˆ์—์„œ์˜ ๋นˆ๋ฌธ์ž์—ด๊ณผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, 'c\Brat\Be' ๋Š” 
'create' ์™€ ๋งค์นญํ•˜๊ณ , 'dirty \Brat'์€ 'dirty rat'๊ณผ ๋งค์นญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

4.1.4 Match-beginning-of-word Operator (\<) 
------------------------------------------- 

'\<' ๋Š” ๋‹จ์–ด์˜ ์‹œ์ž‘์—์„œ ๋นˆ๋ฌธ์ž์—ด์„ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 

4.1.5 Match-end-of-word Operator (\>) 
---------------------------------------- 

'\>' ๋Š” ๋‹จ์–ด์˜ ๋์—์„œ ๋นˆ๋ฌธ์ž์—ด๊ณผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 

................................................................. 
queen:~/regex$ grep "\<char\>" regex.c 
return (char *) re_error_msg[(int) ret]; 
const char *s; 
.... 
queen:~/regex$ 
................................................................. 

4.1.6 Match-word-constituent Operator (\w) 
------------------------------------------ 

'\w' ๋Š” ๋‚ฑ๋ง์„ ์ด๋ฃจ๋Š” ์–ด๋–ค ๋ฌธ์ž์™€ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 

4.1.7 Match-non-word-constituent Operator(\W) 
--------------------------------------------- 

'\W' ๋Š” ๋‚ฑ๋ง์˜ ์„ฑ๋ถ„์š”์†Œ๊ฐ€ ์•„๋‹Œ ์–ด๋–ค ๋ฌธ์ž์™€ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 

.................................................................. 
queen:~/regex$ echo " int " | grep "\Wi\wt" 
int 
queen:~/regex$ 
.................................................................. 

'\w' ๊ณผ '.'์˜ ์ฐจ์ด์ ์€ ์ „์ž๋Š” ๋‚ฑ๋ง์†์˜ ์–ด๋А ํ•œ๋ฌธ์ž(๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‚ฑ๋ง์˜ ๊ตฌ์„ฑ์š”์†Œ) 
์™€ ๋งค์นญ์ด ๋˜๋‚˜, '.'๋Š” ์ด๊ฒƒ์ €๊ฒƒ ๋”ฐ์ง€์ง€ ์•Š๊ณ  ์–ด๋А ํ•œ๋ฌธ์ž์™€ ๋งค์นญ์ด ๋˜๋ฏ€๋กœ ์กฐ๊ธˆ 
์˜๋ฏธ์ ์œผ๋กœ ํ‹€๋ฆฝ๋‹ˆ๋‹ค. ์•„์šธ๋Ÿฌ, '\W'๋„ ๋‚ฑ๋ง์†์˜ ์–ด๋–ค ๋ฌธ์ž (์˜ˆ๋ฅผ ๋“ค๋ฉด, 'int'์†์˜ 
'n')๊ณผ๋Š” ๋งค์นญ์ด ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋‚ฑ๋ง์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์–ด๋–ค ํ•œ๋ฌธ์ž (์˜ˆ๋ฅผ ๋“ค๋ฉด, ' ') 
์™€ ๋งค์นญ์ด ๋ฉ๋‹ˆ๋‹ค. 


4.2 ๋ฒ„ํผ ์˜คํผ๋ ˆ์ดํ„ฐ 
-------------------- 

์ด์ œ ์„ค๋ช…ํ•  ๊ฒƒ์€ ๋ฒ„ํผ์—์„œ ์ž‘๋™ํ•˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด๋งฅ์Šค์—์„œ์˜ buffer๋Š” 
"์ด๋งฅ์Šค buffer" ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ „์ฒด ๋ฌธ์ž์—ด์„ ๋ฒ„ํผ๋กœ ์—ฌ๊น๋‹ˆ๋‹ค. 

4.2.1 Match-beginning-of-buffer Operator (\`) 
---------------------------------------------- 

'\`'๋Š” ๋ฒ„ํผ์˜ ์‹œ์ž‘๋˜๋Š” ๋ถ€๋ถ„์˜ ๋นˆ๋ฌธ์ž์—ด๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 

4.2.2 Match-end-of-buffer Operator (\') 
---------------------------------------- 

'\''๋Š” ๋ฒ„ํผ์˜ ๋ ๋ถ€๋ถ„์˜ ๋นˆ๋ฌธ์ž์—ด๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. 


5. GNU ์ด๋งฅ์Šค ์˜คํผ๋ ˆ์ดํ„ฐ 
------------------------- 

์ด์ œ ์„ค๋ช…ํ•  ๊ฒƒ์€ POSIX์—์„œ๋Š” ์ •์˜๋˜์ง€ ์•Š์•˜๊ณ , GNU์—์„œ ์ •์˜๋˜์—ˆ์œผ๋ฉฐ, ์ด๊ฒƒ์„ ์‚ฌ 
์šฉํ•  ๋•Œ๋Š” Regex ๊ฐ€ ์ปดํŒŒ์ผ ๋  ๋•Œ ์ „์ฒ˜๋ฆฌ ์‹ฌ๋ณผ์„ ์ •์˜๋œ emacs๋กœ ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

5.1 ๋ฌธ๋ฒ• ํด๋ž˜์Šค ์˜คํผ๋ ˆ์ดํ„ฐ (syntactic class operators) 
--------------------------- 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์€ Regex ๊ฐ€ ์ด ๋ฌธ๋ฒ• ๋ฌธ์ž๋“ค์˜ ํด๋ž˜์Šค๋ฅผ ์ธ์‹ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
Regex ๋Š” ์ด๊ฒƒ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

5.1.1 ์ด๋งฅ์Šค ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ” 
------------------------ 

ํ•˜๋‚˜์˜ ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”์€ ์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ๋ฌธ์ž์…‹(์•„์Šคํ‚ค๋ฌธ์ž์…‹ ๊ฐ™์€ ๊ฒƒ๋“ค..)์— ์˜ํ•ด ์ธ๋ฑ 
์Šคํ™”๋œ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์•„์Šคํ‚ค ํ•˜์—์„œ๋Š” ๋”ฐ๋ผ์„œ ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”์€ 256๊ฐœ์˜ ์›์†Œ 
๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. 

Regex ๊ฐ€ ์ „์ฒ˜๋ฆฌ ์‹ฌ๋ณผ, ์ •์˜๋œ emacs ๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ 
re_syntax_table ์„ ์ •์˜ํ•˜๊ณ  ๊ทธ ๊ฐ’์„ ์ด๋งฅ์Šค ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
์ด๋งฅ์Šค ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”์€ Regex ์˜ ๋ฌธ๋ฒ• ํ…Œ์ด๋ธ”๋ณด๋‹ค๋Š” ์ข€ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. 

5.1.2 Match-syntactic-class Operator (\sclass) 
----------------------------------------------- 

์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ฌธ๋ฒ• ํด๋ž˜์Šค๊ฐ€, ์„œ์ˆ ๋œ ๋ฌธ์ž๊ฐ€ ๋ช…์‹œํ•˜๋Š”, ์–ด๋–ค ๋ฌธ์ž๋ฅผ ๋งค์นญ 
ํ•ฉ๋‹ˆ๋‹ค. '\sclass'๊ฐ€ ์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, class๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์›ํ•˜๋Š” ๋ฌธ๋ฒ• 
ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์—ฌ, 'w' ๋Š” ๋‹จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฌธ์ž์˜ ๋ฌธ๋ฒ• 
๊ธ€๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ, '\sw'์€ ๋‹จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์•„๋ฌด ๋ฌธ์ž์™€ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 

5.1.3 Match-not-syntactic-class Operator (\Sclass) 
--------------------------------------------------- 

์œ„์˜ ์˜คํผ๋ ˆ์ดํ„ฐ์™€๋Š” ๋ฐ˜๋Œ€๋˜๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 'w' ๋Š” ๋‹จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฌธ์ž 
์˜ ๋ฌธ๋ฒ• ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ, '\Sw' ์€ ๋‹จ์–ด์˜ ๊ตฌ์„ฑ์„ฑ๋ถ„์ด ์•„๋‹Œ ์•„๋ฌด ๋ฌธ์ž์™€ ๋งค 
์นญ๋ฉ๋‹ˆ๋‹ค. 


์ง€๊ฒน๊ฒŒ ์ง€๊ธˆ๊นŒ์ง€ ๋งŽ์„ ๊ฒƒ์„ ์„ค๋ช…๋“œ๋ ธ์ง€๋งŒ, ์‚ฌ์‹ค ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ํ•œ๊บผ๋ฒˆ์— ๊ธฐ์–ตํ•˜ 
์‹ค ํ•„์š”์„ฑ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด์„œ ๊ทธ๋•Œ๊ทธ๋•Œ ๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ์ต์ˆ™ํ•˜๊ฒŒ ์ตํžˆ 
์‹œ๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฆฌ๋ผ ๋ด…๋‹ˆ๋‹ค. 

์ด์ œ, ์กฐ๊ธˆ ๋” ์žฌ๋ฏธ์žˆ๋Š” Regex ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋“ค์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. 


6. Regex ํ”„๋กœ๊ทธ๋ž˜๋ฐ 
-------------------- 

Regex ๋Š” ์„ธ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” GNU๋ฅผ ์œ„ํ•ด ๋””์ž์ธ ๋œ ๊ฒƒ๊ณผ, 
ํ•˜๋‚˜๋Š” POSIX ์— ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ, ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” Berkeley UNIX ์— ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์ž… 
๋‹ˆ๋‹ค. 
๋‹ค๋ฅธ ์œ ๋‹‰์Šค ๋ฒ„์ ผ์—๋„ ์ถฉ๋ถ„ํžˆ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์‹œ๋ ค๋ฉด, POSIX 
Regex ํ•จ์ˆ˜๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜์‹œ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ, GNU 
์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹œ๋ ค๋ฉด GNU Regex ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ์ž…๋‹ˆ 
๋‹ค. 

๊ทธ๋Ÿผ, ๋จผ์ € ๋น„๊ต์  ๊ฐ„๋‹จํ•œ BSD Regex ํ•จ์ˆ˜๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

6.1 BSD Regex ํ•จ์ˆ˜ 
------------------- 

Berkeley UNIX ์— ํ˜ธํ™˜๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด, ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์š”. 
๊ทธ๋Ÿฌ๋‚˜, ๊ทธ๋‹ค์ง€ ๋งŽ์€ ๊ธฐ๋Šฅ์€ ์ง€์›๋˜์ง€ ์•Š๊ณ , ๊ฐ„๋‹จํ•œ ๋‘๊ฐœ์˜ ํ•จ์ˆ˜๋งŒ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. 
๋”ฐ๋ผ์„œ, BSD Regex ํ•จ์ˆ˜๋กœ๋Š” ๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰์€ ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋งค์นญ์ž‘์—…์€ ํ•  ์ˆ˜ ์—†์Šต 
๋‹ˆ๋‹ค. 

BSD Regex ํ•จ์ˆ˜๋กœ ๊ฒ€์ƒ‰์„ ํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

1) re_syntax_options ์˜ ๊ฐ’์„ ์›ํ•˜๋Š” ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ๋ฒ•๋น„ํŠธ์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 
์•ž์—์„œ ์„ค๋ช…์ด ๋œ, ๊ฐ์ข…์˜ ๋ฌธ๋ฒ• ๋น„ํŠธ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์˜ˆ) re_syntax_options = RE_SYNTAX_POSIX_BASIC; 

2) ์ •๊ทœํ‘œํ˜„์‹์„ ์ปดํŒŒ์ผ ํ•ฉ๋‹ˆ๋‹ค. 

char *re_comp (char *regex) 

regex ๋Š” ๋„๋กœ ๋๋‚˜๋Š” ์ •๊ทœํ‘œํ˜„์‹์˜ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. re_comp ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํŒจํ„ด 
๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋…ธ์ถœ์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ์šด ์ •๊ทœ 
ํ‘œํ˜„์‹์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด, ํ•ด๋‹น ์ •๊ทœํ‘œํ˜„์‹์„ ์žฌ ์ปดํŒŒ์ผํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด๋ถ€ 
์˜ ํŒจํ„ด๋ฒ„ํผ๋ฅผ ํ˜„์žฌ์˜ ์ •๊ทœํ‘œํ˜„์‹๊ณผ ๋งž์ถ”์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์ผ 
regex ๋ฅผ NULL์ŠคํŠธ๋ง ์œผ๋กœ ์ปดํŒŒ์ผ ํ• ๊ฒฝ์šฐ์—๋Š” ๋‚ด๋ถ€์˜ ํŒจํ„ด๋ฒ„ํผ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋‹ˆ 
์ฃผ์˜๋ฅผ ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

re_comp ๋Š” ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๋‹ค๋ฉด, NULL์„ ๋Œ๋ ค์ฃผ๋ฉฐ, ์ •๊ทœํ‘œํ˜„์‹์ด ์ž˜๋ชป 
๋˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์—๋Ÿฌ ๋ฌธ์ž์—ด์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. 
์ด ์—๋Ÿฌ ๋ฌธ์ž์—ด์€ ๋’ค์— ๋‚˜์˜ฌ re_compile_pattern ์˜ ๊ทธ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

3) ๊ฒ€์ƒ‰์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค. 

int re_exec (char *string) 

ํ•œ๋ฒˆ re_comp ๋กœ ์ •๊ทœํ‘œํ˜„์‹์„ ์ปดํŒŒ์ผ ํ•˜์˜€๋‹ค๋ฉด, ์ด์ œ re_exec ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 
string ๋ฌธ์ž์—ด๋‚ด์—์„œ ํ•ด๋‹น ํ‘œํ˜„์ด ๋‚˜์˜ค๋Š” ์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

re_exec ๋Š” ๊ฒ€์ƒ‰์— ์„ฑ๊ณตํ–ˆ์„ ๊ฒฝ์šฐ์— 1์„ ๋ฆฌํ„ดํ•˜๊ณ , ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” 0์„ ๋ฆฌํ„ด 
ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด GNU fastmap ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

์ž, ๊ทธ๋Ÿผ ์ด์ œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ์œ„์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 
๊ฐ„๋‹จํ•œ ํŒจํ„ด ๊ฒ€์ƒ‰์„ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

--------------------------------------------------------------------------- 

/* BSD Regex functions example 

Usage : bsd search_string pattern 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include "regex.h" 

void main(int argc, char *argv[]) { 
char *error; 
re_syntax_options = RE_SYNTAX_POSIX_BASIC; 

if (argc != 3) exit(1); 
if ((error = re_comp(argv[2])) != NULL) { 
fprintf(stderr, "re_comp: %s: %s\n", argv[2], error); 
exit(1); 
} 
switch(re_exec(argv[1])) { 
case 0 : 
fprintf(stderr, "re_exec: \"%s\" failure..\n", argv[1]); 
break; 
case 1 : 
fprintf(stderr, "re_exec: \"%s\" success..\n", argv[1]); 
break; 
} 
} 

-------------------------------------------------------------------------- 

๋จผ์ €, ํ˜„์žฌ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ํ…Œ์ŠคํŠธ ํ•˜์‹œ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— "regex.c" ์™€ "regex.h" ๋ฅผ ํ•œ 
๋ถ€ ๋ณต์‚ฌํ•ด ๋‘์‹œ๊ณ , regex.c ๋ฅผ ์ปดํŒŒ์ผ๋งŒ ํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ด๋ฏธ ์ปด 
ํŒŒ์ผ๋œ regex.o ๋ฅผ ํ•œ๋ถ€ ๊ฐ€์ง€๊ณ  ์˜ต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํ•  ๊ฒฝ์šฐ, 

queen:~/regex$ gcc -c regex.c -g 

์œ„์˜ ์†Œ์Šค๋ฅผ bsd.c ๋กœ ์ €์žฅ์„ ํ•œ๋‹ค๋ฉด, ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

queen:~/regex$ gcc -o bsd bsd.c regex.o 

๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. 

........................................................................ 
queen:~/regex$ bsd "lnx5, 2445 #linux" "[[:digit:]]\{4\}\W.li\w\wx" 
re_exec: "lnx5, 2445 #linux" success.. 
queen:~/regex$ bsd "printf (\"int i = 10\")" "\<int\b" 
re_exec: "printf ("int i = 10")" success.. 
queen:~/regex$ bsd "regex is powerful" "\b\w*\W[is" 
re_comp: \b\w*\W[is: Unmatched[ or [^ 
queen:~/regex$ 
........................................................................ 

๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” POSIX Regex ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

ํ˜„์žฌ ํ• ์ผ์ด ๋ฐ€๋ ค์„œ ์ด๋ฒˆ ์‹œ๊ฐ„์€ ์กฐ๊ธˆ ์ค„์ด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

๋˜์น˜ ํ•œ๋™ํ›ˆ ๋“œ๋ฆผ 

๋ฒˆ ํ˜ธ : 619 
๊ฒŒ์‹œ์ž : ํ•œ๋™ํ›ˆ (ddoch ) 
๋“ฑ๋ก์ผ : 1997-06-02 20:14 
์ œ ๋ชฉ : [๊ฐ•์ขŒ] Regex (์ •๊ทœํ‘œํ˜„์‹) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (4) 

GNU REGEX (์ •๊ทœํ‘œํ˜„์‹) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์ขŒ (4) 
------------------------------------------- 

6.2 POSIX Regex ํ•จ์ˆ˜ 
--------------------- 

POSIX ์™€ ํ˜ธํ™˜๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์—ฌ๊ธฐ์— ๋‚˜์˜ค๋Š” ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต 
๋‹ˆ๋‹ค. 

6.2.1 POSIX ํŒจํ„ด ๋ฒ„ํผ 
---------------------- 

POSIX ์—์„œ ์ •๊ทœํ‘œํ˜„์‹์„ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ ๋งค์นญ์ž‘์—…์„ ํ•˜๋ ค๋ฉด, BSD ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ 
ํŒจํ„ด ๋ฒ„ํผ๋ฅผ ์ œ๊ณตํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. regex_t ํƒ€์ž…์ธ POSIX ํŒจํ„ด ๋ฒ„ํผ๋Š”, 
re_pattern_buffer ํƒ€์ž…์ธ GNU ํŒจํ„ด๋ฒ„ํผ์™€ ๊ตฌ์„ฑ์ด ๋™์ผ ํ•ฉ๋‹ˆ๋‹ค. 

"regex.h" ์— ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜•์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

typedef struct re_pattern_buffer regex_t; 

ํŒจํ„ด ๋ฒ„ํผ๋ž€ ์ด์ „์—๋„ ๋ง์”€๋“œ๋ ธ์ง€๋งŒ, ํ•ด๋‹น ์ •๊ทœํ‘œํ˜„์‹์—์„œ ํŒจํ„ด์„ ๋งค์นญ์‹œํ‚ค๊ธฐ ์œ„ํ•œ 
๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฒ„ํผ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌผ๋ก , ์ปดํŒŒ์ผ์„ ํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ๊ฐ€๋Šฅ 
ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋Ÿผ, ๋จผ์ € GNU ํŒจํ„ด ๋ฒ„ํผ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”? 

์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ์ข…๋ฅ˜์˜ ํŒจํ„ด ๋ฒ„ํผ๋ฅผ ๋™์‹œ์— ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
"regex.h" ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŒจํ„ด ๋ฒ„ํผ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

/* ์ปดํŒŒ์ผ๋œ ํŒจํ„ด์„ ๊ฐ€๋ฅดํ‚ค๋Š” ํฌ์ธํ„ฐ. ์ด๊ฒƒ์˜ ์›์†Œ๋Š” ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ 
์‚ฌ์šฉ๋  ๋•Œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 'unsigned char *'๋กœ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */ 
unsigned char *buffer; 

/* 'buffer' ๊ฐ€ ํฌ์ธํŠธํ•˜๋Š” ๋ฐ”์ดํŠธ์ˆ˜ */ 
unsigned long allocated; 

/* 'buffer' ์•ˆ์— ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฐ”์ดํŠธ์ˆ˜ */ 
unsigned long used; 

/* ํŒจํ„ด์ด ์ปดํŒŒ์ผ๋  ๋•Œ ์„ธํŒ…๋˜๋Š” ๋ฌธ๋ฒ• */ 
reg_syntax_t syntax; 

/* ์–ด๋–ค fastmap ์„ ๊ฐ€๋ฅดํ‚ค๋Š” ํฌ์ธํ„ฐ. NULL ์ด๋ผ๋ฉด ํฌ์ธํŒ… ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ 
๋‹ค. re_search ๋Š”, ๋งŒ์ผ fastmap ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ, ๋น ๋ฅธ ๋งค์นญ์„ ์œ„ํ•ด์„œ, ๋งค์นญ 
์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ถœ๋ฐœ ํฌ์ธํŠธ๋Š” ๊ฑด๋„ˆ ๋›ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. */ 
char *fastmap; 

/* NULL ์ด ์•„๋‹ˆ๋ผ๋ฉด, ์–ด๋–ค ๋ฌธ์ž๋“ค์„ ๋น„๊ตํ•˜๊ธฐ ์ „์—, ๋ชจ๋“  ๋ฌธ์ž๋“ค์— ์ ์šฉ๋˜๋Š” 
๋ณ€ํ™˜ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. NULL ์ผ ๊ฒฝ์šฐ์—๋Š” ๋ณ€ํ™˜์ด ์—†์Šต๋‹ˆ๋‹ค. */ 
char *translate; 

/* (์ •๊ทœํ‘œํ˜„์‹) ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ฐœ๊ฒฌ๋œ ๋ณด์กฐํ‘œํ˜„์‹์˜ ์ˆ˜ */ 
size_t re_nsub; 

/* ํ˜„์žฌ์˜ ํŒจํ„ด์ด ๋นˆ๋ฌธ์ž์—ด๊ณผ ๋งค์นญํ•  ์ˆ˜ ์—†๋‹ค๋ฉด 0์ด ๋˜๊ณ , ๊ทธ์™ธ๋Š” 1์ด ๋ฉ๋‹ˆ๋‹ค. 
์ด๊ฒƒ์€ 're_search_2' ์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. */ 
unsigned can_be_null : 1; 

/* REGS_UNALLOCATED : 'regs' ๊ตฌ์กฐ์ฒด์— RE_NREGS ๋‚˜ re_nsub + 1 ์ค‘ ํฐ์ˆ˜ 
์ˆ˜ ๋งŒํผ ๊ทธ๋ฃน์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. 
REGS_REALLOCATE : ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ณต๊ฐ„์„ ์žฌ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. 
REGS_FIXED : ๊ทธ๋ƒฅ ์žˆ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. */ 
#define REGS_UNALLOCATED 0 
#define REGS_REALLOCATE 1 
#define REGS_FIXED 2 
unsigned regs_allocated : 2; 

/* ํŒจํ„ด์„ 'regex_compile' ๋กœ ์ปดํŒŒ์ผ ํ•  ๋•Œ 0์œผ๋กœ ์„ธํŒ…๋ฉ๋‹ˆ๋‹ค. 
're_compile_fastmap'์ด fastmap ์„ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒฝ์šฐ์—๋Š” 1๋กœ ์„ธํŒ…๋ฉ๋‹ˆ๋‹ค. */ 
unsigned fastmap_accurate : 1; 

/* ์ด๊ฒƒ์ด ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, 're_match_2' ๋Š” ๋ณด์กฐํ‘œํ˜„์‹์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•˜ 
์ง€ ์•Š์Šต๋‹ˆ๋‹ค. */ 
unsigned no_sub : 1; 

/* ์ด๊ฒƒ์ด ์„ธํŠธ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ผ์ธ์˜ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ์‹œ๊ธฐ(์ผ๋ฐ˜์ ์œผ๋กœ๋Š” '^') 
๋Š” ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘์„ ๋งค์นญํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. */ 
unsigned not_bol : 1; 

/* ์ด๊ฒƒ์€ ๋ผ์ธ์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ์‹œ๊ธฐ(์ผ๋ฐ˜์ ์œผ๋กœ๋Š” '$')์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. */ 
unsigned not_eol : 1; 

/* ์ด๊ฒƒ์ด ์„ธํŠธ๋˜๋ฉด, ๋‰ด๋ผ์ธ์—์„œ ํ‘œ์‹œ๊ธฐ๊ฐ€ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. */ 
unsigned newline_anchor : 1; 


์‚ฌ์‹ค, ์ด ๊ฐ€์šด๋ฐ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ช‡๊ฐœ ์ •๋„์— ์ง€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

6.2.2 POSIX ์ •๊ทœํ‘œํ˜„์‹ ์ปดํŒŒ์ผ 
------------------------------ 

ํŒจํ„ด ๋ฒ„ํผ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด 'regcomp' ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

int regcomp (regex_t *preg, const char *regex, int cflags) 

'preg' ๋Š” ์ดˆ๊ธฐํ™”ํ•  ํŒจํ„ด ๋ฒ„ํผ์˜ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. 'regex' ๋Š” ์ •๊ทœํ‘œํ˜„์‹์˜ ์ฃผ์†Œ์ž… 
๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  cflags ๋Š” ์กฐํ•ฉ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•œ ๋น„ํŠธ๋Š” ๋‹ค์Œ 
๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

REG_EXTENDED 
POSIX ํ™•์žฅ ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์„ธํŠธ๋˜์–ด 
์žˆ์ง€ ์•Š๋‹ค๋ฉด POSIX ๊ธฐ๋ณธ ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 
regcomp ๋Š” 'preg'์˜ syntax ํ•„๋“œ๋ฅผ ๊ทธ์— ์•Œ๋งž๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 

REG_ICASE 
๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ฌด์‹œํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. regcomp ๋Š” 'preg' ์˜ 'translate' 
ํ•„๋“œ๋ฅผ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๋ณ€ํ™˜๋ฐ์ด๋ธ”๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 

REG_NOSUB 
'preg' ์˜ 'no_sub' ํ•„๋“œ๋ฅผ ์„ธํŠธํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. 

REG_NEWLINE 
* match-any-character operator ('.')๋Š” newline ์„ ๋งค์นญํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. 
* nonmatching list ('[^...]')๋Š” newline ์„ ํฌํ•จํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. 
* match-beginning-of-line ('^') ๋Š” REG_NOTBOL ์ด ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š”๊ฐ€ 
์— ๊ฐœ์˜์น˜ ์•Š๊ณ  newline ๋ฐ”๋กœ ๋’ค์˜ ๋นˆ๋ฌธ์Ÿˆ์—ด์„ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 
* match-end-of-line operator ('$') ๋Š” REG_NOTEOL ์ด ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š” 
๊ฐ€์— ๊ฐœ์˜์น˜ ์•Š๊ณ  newline ๋ฐ”๋กœ ์ด์ „์— ์˜ค๋Š” ๋นˆ๋ฌธ์ž์—ด์„ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. 

regcomp ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ •๊ทœํ‘œํ˜„์‹์„ ์ปดํŒŒ์ผํ•˜๊ฒŒ ๋˜๋ฉด, 0์„ ๋ฆฌํ„ดํ•˜๊ณ , 
'*pattern_buffer' ๋ฅผ ์ปดํŒŒ์ผ๋œ ํŒจํ„ด์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. syntax ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š”, 
์ดํ›„์— ์‚ดํŽด๋ณผ GNU ์ปดํŒŒ์ผ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ™์€ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 

regcomp ๊ฐ€ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด, ์•„๋ž˜์˜ ์—๋Ÿฌ์ฝ”๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 

REG_BADRPT 
์˜ˆ๋ฅผ ๋“ค๋ฉด, 'a**' ์•ˆ์˜ ์—ฐ์†์ ์ธ ๋ฐ˜๋ณต ์—ฐ์‚ฐ์ž '**' ์˜ ๊ฒฝ์šฐ 

REG_BADBR 
์˜ˆ๋ฅผ ๋“ค๋ฉด, 'a\{-1' ์—์„œ์˜ count '-1' ๊ฐ™์€ ๊ฒฝ์šฐ 

REG_EBRACE 
์˜ˆ๋ฅผ ๋“ค๋ฉด, 'a\{1' ๊ณผ ๊ฐ™์ด '}' ๊ฐ€ ๋น ์ง„ ๊ฒฝ์šฐ 

REG_EBRACK 
์˜ˆ๋ฅผ ๋“ค๋ฉด, '[a' ์™€ ๊ฐ™์ด ']' ๊ฐ€ ๋น ์ง„ ๊ฒฝ์šฐ 

REG_ERANGE 
์˜ˆ๋ฅผ ๋“ค๋ฉด, '[z-a]' ๋‚˜ '[[:alpha:]-|]' ๊ณผ ๊ฐ™์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ 

REG_ECTYPE 
์˜ˆ๋ฅผ ๋“ค๋ฉด, '[[:foo:]' ์™€ ๊ฐ™์ด ์ž˜๋ชป๋œ ํด๋ž˜์Šค ๋ช…์นญ์ธ ๊ฒฝ์šฐ 

REG_EPAREN 
์˜ˆ๋ฅผ ๋“ค๋ฉด, 'a\)' ์™€ ๊ฐ™์ด '(' ๋ฅผ ๋น ๋œจ๋ ธ์„ ๊ฒฝ์šฐ 

REG_ESUBREG 
์˜ˆ๋ฅผ ๋“ค๋ฉด, '\(a\)\2' ์™€ ๊ฐ™์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ 

REG_EEND 
์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ •๊ทœํ‘œํ˜„์‹์ด ๋” ์ด์ƒ์˜ ๋ช…๋ฐฑํ•œ ์—๋Ÿฌ๋ฅผ ์•ผ๊ธฐํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ 

REG_EESCAPE 
์˜ˆ๋ฅผ ๋“ค๋ฉด, 'a\' ์—์„œ์™€ ๊ฐ™์ด '\' ๊ฐ€ ์ž˜๋ชป ์‚ฌ์šฉ๋˜์—ˆ์„ ๊ฒฝ์šฐ 

REG_BADPAT 
์˜ˆ๋ฅผ ๋“ค๋ฉด, ํ™•์žฅ ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ๋ฒ•์—์„œ 'a()b' ์—์„œ์˜ ๋นˆ๊ทธ๋ฃน '()' ์ด ๋‚˜์˜ฌ ๊ฒฝ์šฐ 

REG_ESIZE 
์ •๊ทœํ‘œํ˜„์‹์ด ํŒจํ„ด ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋กœ 65536 ๋ณด๋‹ค ํฐ ๋ฐ”์ดํŠธ๋ฅผ ํ•„์š”๋กœ ํ•  ๊ฒฝ์šฐ 

REG_ESPACE 
์ •๊ทœํ‘œํ˜„์‹์ด Regex ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชจ์ž๋ผ๊ฒŒ ํ•  ๊ฒฝ์šฐ 


6.2.3 POSIX ๋งค์นญ 
------------------ 

ํ•œ๋ฒˆ, ํŒจํ„ด์„ ํŒจํ„ด๋ฒ„ํผ๋กœ ์ปดํŒŒ์ผ์„ ํ–ˆ๋‹ค๋ฉด, ์ด์ œ ๋งค์นญ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
์ด ๋งค์นญ์ž‘์—…์„ 'regexec' ๊ฐ€ ์ˆ˜ํ–‰์„ ํ•ฉ๋‹ˆ๋‹ค. 

int regexec (const regex_t *preg, const char *string, 
size_t nmatch, regmatch_t pmatch[], int eflags) 

'preg' ๋Š” ํŒจํ„ด์„ ์ปดํŒŒ์ผํ•œ ํŒจํ„ด ๋ฒ„ํผ์˜ ์ฃผ์†Œ์ด๊ณ , 'string' ์€ ๋งค์นญ์„ ํ•˜๊ธฐ๋ฅผ 
์›ํ•˜๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. 'pmatch' ์— ๋Œ€ํ•ด์„œ๋Š” ๋’ค์—์„œ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…์ด ๋ฉ๋‹ˆ๋‹ค. 
'nmatch' ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, 'preg' ๋ฅผ ์ปดํŒŒ์ผ ์˜ต์…˜ REG_NOSUB ๋กœ ์„ธํŒ…ํ•˜์˜€๋‹ค 
๋ฉด 'regexec' ๋Š” 'pmatch' ๋ฅผ ๋ฌด์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์  
์–ด๋„ 'nmatch' ์›์†Œ๋“ค ๋งŒํผ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. regexec ๋Š” 'nmatch' ๋ฐ”์ดํŠธ ์˜ต์…‹์„ 
'pmatch' ์— ๊ธฐ๋ก์„ ํ• ๊ฒƒ์ด๋ฉฐ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์›์†Œ๋ฅผ -1๋ถ€ํ„ฐ 'pmatch[nmatch]-1' 
๊นŒ์ง€ ์„ค์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

'eflags' ๋Š” ์‹คํ–‰ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๋ฉฐ, REG_NOTBOL ๊ณผ REG_NOTEOL ์ด ๋  ์ˆ˜ ์žˆ์Šต 
๋‹ˆ๋‹ค. REG_NOTBOL ์„ ์„ค์ •ํ•œ๋‹ค๋ฉด, match-beginning-of-line operator ('^') ๋Š” 
ํ•ญ์ƒ ๋งค์นญ์— ์‹คํŒจ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. REG_NOTEOL ์€ match-end-of-line operator ์— ์žˆ์–ด 
์„œ ์œ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. 

regexec ๋Š” ์ปดํŒŒ์ผ๋œ ํŒจํ„ด์ด 'string' ๊ณผ ๋งค์นญ์ด ๋˜์—ˆ๋‹ค๋ฉด 0์„, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, 
REG_NOMATCH ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. 

6.2.4 ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ 
--------------------------- 

regcomp ๋‚˜ regexec ๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด, 0์ด ์•„๋‹Œ ์—๋Ÿฌ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ 
์—๋Ÿฌ์ฝ”๋“œ๋“ค์€ ์œ„์˜ 6.2.2 ์™€ 6.2.3 ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ์—๋Ÿฌ์ฝ”๋“œ์— ํ•ด๋‹นํ•˜๋Š” 
์—๋Ÿฌ ๋ฌธ์ž์—ด์„ ์–ป์œผ๋ ค๋ฉด 'regerror'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

size_t regerror (int errcode, 
const regex_t *preg, 
char *errbuf, 
size_t errbuf_size) 

'errcode' ๋Š” ์—๋Ÿฌ์ฝ”๋“œ์ด๊ณ , 'preg' ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ํŒจํ„ด๋ฒ„ํผ์ด๋ฉฐ, 'errbuf' ๋Š” 
์—๋Ÿฌ ๋ฒ„ํผ์ด๋ฉฐ, 'errbuf_size' ๋Š” 'errbuf' ์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. 

regerror ๋Š” 'errcode' ์— ๋Œ€์‘ํ•˜๋Š” ์—๋Ÿฌ ๋ฌธ์ž์—ด์˜ ๋ฐ”์ดํŠธ ํฌ๊ธฐ(๋„๋ฌธ์ž๊นŒ์ง€ ํฌํ•จ) 
๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 'errbuf' ์™€ 'errbuf_size' ๊ฐ€ 0์ด ์•„๋‹ˆ๋ผ๋ฉด, 'errbuf' ์— ์ฒ˜์Œ 
errbuf_size-1 ๋ฌธ์ž์˜ ์—๋Ÿฌ ๋ฌธ์ž์—ด์„ ๋„๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. 
'errbuf_size' ๋Š” 'errbuf' ์˜ ๋ฐ”์ดํŠธ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์ˆ˜์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
์—ฌ๋Ÿฌ๋ถ„๋“ค์€, 'regerror' ์˜ ์—๋Ÿฌ ๋ฌธ์ž์—ด์„ ๋‹ด์•„๋‚ด๋Š” ๋ฐ ์–ผ๋งˆ๋งŒํผ ํฌ๊ธฐ์˜'errbuf' 
๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ 'errbuf' ๋ฅผ NULL๋กœ, 'errbuf_size' ๋ฅผ 0์œผ๋กœ ํ•ด์„œ 
ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

6.2.5 ๋ฐ”์ดํŠธ ์˜ต์…‹ ์‚ฌ์šฉํ•˜๊ธฐ 
--------------------------- 

POSIX ์—์„œ, regmatch_t ํ˜• ๋ณ€์ˆ˜๋Š” GNU ์˜ ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๋˜‘๊ฐ™์ง€๋Š” ์•Š 
์Šต๋‹ˆ๋‹ค. POSIX ์—์„œ ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด regexec ์—, regmatch ํ˜• ๋ณ€์ˆ˜์ธ, 
0์ด ์•„๋‹Œ 'pmatch'๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. regmatch_t ํ˜• ๊ตฌ์กฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต 
๋‹ˆ๋‹ค. 

typedef struct { 
regoff_t rm_so; 
regoff_t rm_eo; 
} regmatch_t; 

๋งค์นญ ํ•จ์ˆ˜๊ฐ€ ์ •๋ณด๋ฅผ์–ด๋–ป๊ฒŒ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•˜๋Š” ์ง€๋Š” ๋’ท๋ถ€๋ถ„์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

GNU Regex ์˜ 'regs' ์™€ POSIX ์˜ 'regs' ๋Š” ์œ ์‚ฌํ•˜๊ฒŒ ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. 

'reg' ์˜ 'pmatch', pmatch[i]->rm_so ๋Š” regs->start[i] ์™€ ๋Œ€์‘ํ•˜๊ณ  
pmatch[i]->rm_eo ๋Š” regs->end[i] ์™€ ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. 

6.2.6 POSIX ํŒจํ„ด ๋ฒ„ํผ๋ฅผ Free ํ•˜๊ธฐ 
---------------------------------- 

ํŒจํ„ด ๋ฒ„ํผ์— ํ• ๋‹น๋œ ๊ฒƒ์„ free ํ•˜๋Š” ํ•จ์ˆ˜๋Š” 'regfree' ์ž…๋‹ˆ๋‹ค. 

void regfree (regex_t *preg) 

'preg' ๋Š” free ํ• , ํ• ๋‹น๋œ ํŒจํ„ด๋ฒ„ํผ์ž…๋‹ˆ๋‹ค. regfree ๋Š” ๋˜ํ•œ 'preg'์˜ 'allocated' 
์™€ 'used' ํ•„๋“œ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ„ด ๋ฒ„ํผ๋ฅผ free ํ•œ ์ดํ›„์—๋Š”, ๋งค์นญ ์ž‘์—…์„ 
์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ •๊ทœํ‘œํ˜„์‹์„ ํ•ด๋‹น ํŒจํ„ด ๋ฒ„ํผ์— ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

6.2.7 POSIX Regex ๋กœ egrep ๋งŒ๋“ค๊ธฐ 
---------------------------------- 

grep ์€ ๊ธฐ๋ณธ ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๊ณ , egrep ์€ ํ™•์žฅ ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, 
์—ฌ๊ธฐ์„œ๋Š” egrep ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๊ธฐ๋Šฅ๋งŒ์œผ๋กœ๋„ egrep ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์€ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
grep ๋ฅ˜์˜ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์€ '๋งค์นญ' ์ด ์•„๋‹ˆ๋ผ '๊ฒ€์ƒ‰'์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค'egrep' ์„ 'my_egrep' ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค๋ฉด, 'my_egrep' ์˜ ๊ธฐ๋ณธ์ ์ธ 
์ž‘๋™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค. 

1) ํŠน๋ณ„ํ•œ ์˜ต์…˜์€ ์ง€์›ํ•˜์ง€ ์•Š๊ณ , ์ธ์ž๋Š” ๋ชจ๋‘ ํŒจํ„ด์ด๋‚˜ ํŒŒ์ผ๋ช…์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. 
2) ์ž…๋ ฅํŒŒ์ผ๋ช…์ด ๋ช…์‹œ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋Š” ํ‘œ์ค€์ž…๋ ฅ์—์„œ ๋ฐ›๋Š”๋‹ค. 
3) ์ปดํŒŒ์ผ ํ”Œ๋ž˜๊ทธ๋Š” 'REG_EXTENDED' ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ์ •๊ทœํ‘œํ˜„์‹์„ ์ง€์›ํ•œ๋‹ค. 

์ถ”๊ฐ€์ ์ธ ์˜ต์…˜์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์†Œ์Šค๋ฅผ ์กฐ๊ธˆ์”ฉ ๊ณ ์น˜๋ฉด์„œ ์‹œ๋„ํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. 

---------------------------------------------------------------------------- 

/* POSIX Regex ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ : egrep ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ 
* 
* Designed by Han-donghun, 1997.5.31 
* 
* name : my_egrep.c 
* 
* compile : First, you must have "regex.c" and "regex.h", 
* in the current directory. 
* 
* To get "regex.o " , type "gcc -c regex.c" 
* Finally, to compile my_egrep.c, type follow. 
* 
* "gcc -o my_egrep my_egrep.c regex.o" 
* 
* usage : my_egrep pattern [files...] 
* 
* This is simple "pattern search" program 
* using POSIX regex, like egrep. 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <errno.h> 
#include "regex.h" /* regex main header file */ 

void main(int argc, char *argv[]) { 
int ret = 0, error, i; 
char *msg; 
char buf[2048]; 
FILE *fp; 
regex_t preg; 

if (argc <= 1) { 
fprintf(stderr, "usage: %s pattern [files..]\n", argv[0]); 
exit(1); 
} 

/* regex compile */ 
if ((error = regcomp(&preg, argv[1], 
REG_EXTENDED | REG_NOSUB)) != 0) { 
ret = regerror(error, &preg, NULL, 0); 
msg = (char *)malloc(sizeof(char)*ret); 
regerror(error, &preg, msg, ret); 
fprintf(stderr, "%s: %s\n", argv[0], msg); 
free(msg); 
exit (1); 
} 

if (argc == 2) { 
while (fgets(buf, 2048, stdin) != NULL) { 
/* regex matching */ 
if ((regexec(&preg, buf, 0, NULL, 0)) == 0) { 
printf("%s", buf); 
} 
} 
} else if (argc > 2) { 
for (i = 2; i < argc ; i++) { 
if ((fp = fopen(argv[i], "r")) == NULL) { 
fprintf(stderr, "%s: %s: %s\n", argv[0], argv[i], strerror(errno)); 
continue; 
} 
while (fgets(buf, 2048, fp) != NULL) { 
/* regex matching */ 
if ((regexec(&preg, buf, 0, NULL, 0)) == 0) { 
printf("%s", buf); 
} 
} 
} 
} 
regfree(&preg); 
} 

--------------------------------------------------------------------------- 

๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ฌด์‹œํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด, ์ •๊ทœํ‘œํ˜„์‹์˜ ์ปดํŒŒ์ผ์‹œ์—, regcomp ์˜ 
REG_EXTENDED ์— REG_ICASE ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค (grep ๋ฅ˜์˜ '-i' ์˜ต์…˜). 
grep ๋ฅ˜์˜ '-v' ๋‚˜ -n' ์˜ต์…˜์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์ด์ œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. 

--------------------------------------------------------------------------- 

$ gcc -o my_egrep my_egrep.c regex.o 
$ my_egrep regcomp ์ •๊ทœํ‘œํ˜„์‹๊ฐ•์ขŒ.๋„ค๋ฒˆ์งธ 
ํŒจํ„ด ๋ฒ„ํผ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด 'regcomp' ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
int regcomp (regex_t *preg, const char *regex, int cflags) 
................ 
$ my_egrep "^[0-9]+\.[0-9]+\b" ์ •๊ทœํ‘œํ˜„์‹๊ฐ•์ขŒ.๋„ค๋ฒˆ์งธ 
6.2 POSIX Regex ํ•จ์ˆ˜ 
6.2.1 POSIX ํŒจํ„ด ๋ฒ„ํผ 
6.2.2 POSIX ์ •๊ทœํ‘œํ˜„์‹ ์ปดํŒŒ์ผ 
6.2.3 POSIX ๋งค์นญ 
6.2.4 ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ 
6.2.5 ๋ฐ”์ดํŠธ ์˜ต์…‹ ์‚ฌ์šฉํ•˜๊ธฐ 
6.2.6 POSIX ํŒจํ„ด ๋ฒ„ํผ๋ฅผ Free ํ•˜๊ธฐ 
6.2.7 POSIX Regex ๋กœ egrep ๋งŒ๋“ค๊ธฐ 
$ 
---------------------------------------------------------------------------- 

(๋‹ค์Œ ์‹œ๊ฐ„์— ์ด์–ด์ง‘๋‹ˆ๋‹ค..) 

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.6631 sec