๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ ์ ๋ชจ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ์๊ณ ์ ๊ณ ์งํ๋ ์ฌ๋์ ๊ฒฐ์ฝ ๊ฒฐ๋จ์ ๋ด๋ฆฌ์ง ๋ชปํ๋ค. โ์๋ฆฌ 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 ๋ง๋ค๊ธฐ
$
----------------------------------------------------------------------------
(๋ค์ ์๊ฐ์ ์ด์ด์ง๋๋ค..)








![[http]](/wiki/imgs/http.png)
