ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
HTML º¯È¯¹®¼
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<article lang="ko">
<!-- -->
<!-- ¹®¼ Á¤º¸ -->
<!-- -->
<articleinfo>
<title>Á¤±ÔÇ¥Çö</title>
<author>
<surname>Çѵ¿ÈÆ</surname>
<affiliation>
<address>
<email>ddoch@hitel.kol.co.kr</email>
</address>
</affiliation>
</author>
<revhistory>
<revision>
<revnumber>0.9</revnumber>
<date>2004³â 3¿ù 4ÀÏ 23½Ã</date>
<revremark>1Â÷ Docbook º¯È¯ ÀÛ¾÷ Á¾·á</revremark>
</revision>
<revision>
<revnumber>0.8</revnumber>
<date>2004³â 2¿ù 29ÀÏ 20½Ã</date>
<revremark>Docbook·Î ¿Å±â±â ½ÃÀÛ</revremark>
</revision>
</revhistory>
</articleinfo>
<abstract>
<para>
¾È³çÇϼ¼¿ä. ddoch Çѵ¿ÈÆ ÀÔ´Ï´Ù.
flex ¿Í bison À» °øºÎÇÏ´ø Áß regex¿¡ ´ëÇÑ Á¤¸®°¡ ÇÊ¿äÇÏ´Ù°í
»ý°¢ÇÏ¿© regex ¸Þ´º¾ó (ÀÚ·á½Ç/¹®¼/2027¹ø ¹®¼/regex.zip)·Î
°øºÎ¸¦ ÇÏ´ø Áß ±×³É¹ø¿ªÇÏ´Â °Í º¸´Ù´Â ½ÇÁ¦ ¿¹¸¦ µé¾î°¡¸é¼
¼³¸íÇÏ´Â °ÍÀÌ ÁÁÀ» °Í °°¾Æ ÀÌ·¸°Ô °Á·Π¿Ã ¸³´Ï´Ù.
</para>
<para>
ÀÌ °Á ³»¿ëÀº À§ ¸Þ´º¾óÀ» Áß½ÉÀ¸·Î ¼³¸íÀ» µå¸± ¿¹Á¤ÀÌ¸ç ¼ø¼
¶ÇÇÑ 6. Regex ÇÁ·Î±×·¡¹Ö Áß ³À̵µ¿¡ µû¶ó ºñ±³Àû ½¬¿î
"BSD Regex ÇÔ¼ö" ºÎÅÍ ¼³¸íÀ» ÇÏ¿´´Ù´Â Á¡À» Á¦¿ÜÇϰí´Â °°½À´Ï´Ù.
±×¸®°í Áß°£Áß°£ ÀÌÇØ¸¦ µ½±âÀ§ÇØ ¿¹Á¦·Î ¼³¸íÀ» ÇϰÚÀ¸¸ç ¼³¸í³»¿ë Áß
À߸øµÈ °ÍÀ̳ª Âü°í»çÇ×Àº À§ÀÇ ÁÖ¼Ò·Î º¸³»ÁÖ½Ã¸é °¨»çÇϰڽÀ´Ï´Ù.
±×¸®°í ¼³¸í Áß ¸ðÀÚ¶ó´Â ºÎºÐÀ̳ª ºüÁø ºÎºÐÀÌ ÀÖÀ» ¼öµµ ÀÖÀ¸¹Ç·Î,
À§¿¡¼ ¸»¾¸µå¸° ¸Þ´º¾óÀ» Âü°íÇϽñ⠹ٶó°Ú½À´Ï´Ù.
</para>
<para>
±×¸®°í 6ÀåÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö ³»¿ëÀº ÀÏ¹Ý ¸®´ª½º ¹× À¯´Ð½º
»ç¿ëÀÚµéÀÌ ÂüÁ¶ÇÒ ¼ö ÀÖ´Â °øÅëÀûÀÎ ³»¿ëÀ̸ç 6ÀåÀº ÇÁ·Î±×·¡¸Ó¸¦
À§ÇÑ ³»¿ëÀÔ´Ï´Ù.
</para>
<para>
regex´Â Á¤±ÔÇ¥Çö½ÄÀ» ÀÌ¿ëÇÏ¿© ÆÐÅÏ °Ë»ö ¹× ¸ÅĪ ÀÛ¾÷À» ¼öÇàÇÏ´Â
ÇÔ¼ö¸¦ Á¦°ø ÇÏ´Â ÀÏÁ¾ÀÇ ¶óÀ̺귯¸®ÀÔ´Ï´Ù. Linux ³ª UNIX¿¡¼
ÀÌ ¶óÀ̺귯¸®´Â ¾ÆÁÖ ±¤¹üÀ§ ÇÏ°Ô »ç¿ëµÇ¾î »ç¿ëÀÚ ¼öÁØ¿¡¼ÀÇ
Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¿© °·ÂÇÑ ÀÛ¾÷À» ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ´Â
¿ªÇÒÀ» ÇÕ´Ï´Ù. ¾Æ¸¶µµ ¸®´ª½º³ª À¯´Ð½º¸¦ »ç¿ëÇÏ½Ã¸é¼ ½©»ó¿¡¼,
<screen>
queen:~$ xanim [a-g]*.gif
</screen>
ÀÌ·± ¸í·ÉÀ» »ç¿ëÇØº¸½Å ºÐµéÀÌ ¸¹ÀÌ °è½Ç °Ì´Ï´Ù.
Ç¥ÁØ ½©¸¸ÀÌ ¾Æ´Ï¶ó, ed, ex, sed, awk, vi, emacs, grep, egrepµîÀÇ
À¯´Ð½º Ç¥ÁØ À¯Æ¿¸®Æ¼µé°ú postgres, bison, flexµîÀÇ Åø µé¿¡¼µµ
³»ºÎÀûÀ¸·Î »ç¿ëÀ» Çϸç, ÇÁ·Î±×·¥À» Á÷Á¢ ¼³Ä¡Çغ¸½Å ºÐÀº
¼Ò½ºµð·ºÅ丮¾È¿¡ "regex.h, regex.c"¶ó´Â ÆÄÀÏ ÀÌ µé¾î ÀÖ´Â °æ¿ì¸¦
Á¾Á¾ º¸¼ÌÀ» °Ì´Ï´Ù.
</para>
<para>
ÀÌ·± Á¤±ÔÇ¥Çö½ÄÀº bison, flex¿¡¼µµ »ç¿ëµÈ´Ù°í ÇÏ¿´´Â µ¥,
À̰ÍÀº °¢Á¾ ¹®ÀÚ¿ ÆÄ½ÌÀ̳ª ¹®Àå, ±¸¹®Çؼ®¿¡ »ç¿ëµÇ¾î ÄÄÆÄÀÏ·¯ Á¦ÀÛ,
¾î¹®Çؼ®±â µîÀÇ ÇÁ·Î±×·¥À» ¸¸µå´Â µ¥ »ç¿ëµË´Ï´Ù.
¾ÆÁ÷ Á¤±ÔÇ¥Çö½Ä¿¡¼ "[°¡-³ª]"¿Í °°Àº ÇѱÛÀ» ó¸®ÇÏÁö ¸øÇϰí ÀÖ´Â µ¥,
ÀÌ·± ¹®Á¦´Â Çѱ۾îÈֺм®±â ¹× ÇѱÛÅäÅ«ºÐ¼®¿¡ ³Á¦·Î µîÀåÇϰí ÀÖ
´Â °ü°è·Î ÀÌÀÇ ÇØ°áÀº ¿ì¸®µéÀÇ ¸òÀÌ ¾Æ´Ò±î »ý°¢ÇÕ´Ï´Ù.
</para>
<para>
¼³Ä¡´Â, ¸®µ¿ ÀÚ·á½Ç¿¡ ÀÖ´Â regex 0.12 ¹öÁ¯
(ÀÚ·á½Ç/2370¹ø/regex012.tgz)À» ¹ÞÀ¸¼Å¼ root·Î ¾ÐÃàÀ» Ǫ½Ã°í
"./configure; make; make install"·Î ¼³Ä¡¸¦ ÇÏ½Ã¸é µË´Ï´Ù.
³×Æ®¿÷¿¡¼ ±¸ÇϽǷÁ¸é GNU °ø½Ä »çÀÌÆ®³ª Çѱ¹¿¡¼ ¹Ì·¯¸¦ Çϰí
ÀÖ´Â Ä«À̽ºÆ®¿¡¼ "regex" ·Î °Ë»öÇϽøé ãÀ» ¼ö ÀÖ½À´Ï´Ù.
</para>
<para>
¸»ÀÌ ¼³Ä¡Áö, ¼³Ä¡µÇ´Â °ÍÀº info ÆÄÀϰú texi ÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ¿©
ÇØ´çµð·ºÅ丮·Î À̵¿½ÃŰ´Â °ÍÀÏ »ÓÀÔ´Ï´Ù. ¾ÐÃàÀ» Ǭ µð·ºÅ丮¿¡
º¸½Ã¸é regex.c ¿Í regex.h°¡ ÀÖ´Â µ¥, ÀÌ µÎ°³°¡ ÀüºÎÀ̹ǷΠÈ޴븦
ÇÏ½Ã¸é¼ »ç¿ëÇϽôøÁö, ¾Æ´Ï¸é regex.o ÆÄÀÏ·Î ¸µÅ©¸¸ ½ÃŰ½Ã´øÁö´Â
¸¶À½´ë·Î ÇÏ½Ã¸é µÉ °ÍÀÔ´Ï´Ù. Âü°í·Î ½½·¢ 3.1¿¡ "/usr/include"¿¡µµ
"regex.h"°¡ ÀÖÀ¸³ª º» Çì´õÆÄÀϰú´Â ´Ù¸£¹Ç·Î ÀÎŬ·çµå ÇÏ½Ç ¶§
ÁÖÀÇÇϽñ⠹ٶø´Ï´Ù. Å×½ºÆ® ÆÄÀÏÀº "test/" µð·ºÅ丮¿¡ ÀÖÀ¸¹Ç·Î
»ìÆìº¸½Ã¸é µµ¿òÀÌ µÉ °ÍÀ̸ç, Å×½ºÆ® ¼Ò½º ÄÄÆÄÀÏÀº "test/" µð·ºÅ丮¿¡¼
"make all" ·Î ÇÏ½Ã¸é µË´Ï´Ù.
</para>
<para>
"regex.h" ÆÄÀÏ¿¡ ¾ÆÁÖ ÀÚ¼¼ÇÑ ¼³¸íÀÌ µé¾î ÀÖÀ¸¹Ç·Î ÀÚÁÖ Âü°í¸¦
ÇϽñ⠹ٶó¸ç, ÇѺΠ»Ì¾Æ¼ º¸¼Åµµ ÁÁ½À´Ï´Ù.
Á¤±ÔÇ¥Çö½ÄÀ» ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥À» Â¥½Ã·Á´Â ºÐµéÀ̳ª
Á¤±ÔÇ¥Çö½ÄÀ» ÀÍÈ÷½Ã·Á´Â ºÐµé¿¡°Ô Á¶±ÝÀ̳ª¸¶ µµ¿òÀÌ µÇ¾úÀ¸¸é ÁÁ°Ú½À´Ï´Ù.
Á¤±ÔÇ¥Çö½ÄÀ» ÀÌ¿ëÇÑ ÇÁ·Î±×·¥ÀÎ egrepÀ» ÀÌ¿ëÇÏ¿© ¼Ò½º³»¿¡¼
ƯÁ¤ ÅäÅ«(¿¹: int)À» ã´Â °æ¿ì¸¦ ¿¹¸¦ µé¾îº¸°Ú½À´Ï´Ù.
<screen>
queen:~$ egrep int something.c
</screen>
ÀÌ·±½ÄÀ¸·Î ãÀ¸¸é "printf" µµ °°ÀÌ °Ë»öÀÌ µÇ¹Ç·Î ¿ä±¸¸¦
ä¿öÁÖÁö ¸øÇÕ´Ï´Ù.
<screen>
queen:~$ egrep "[^[:alnum:]_]int[^[:alnum:]_]" something.c
</screen>
</para>
<para>
ÀÌÁ¦, ÇϳªÀÇ µ¶¸³µÈ ÅäÅ«À¸·Î¼ÀÇ "int"¸¸ ã¾Æ¼ ¿ì¸®¿¡°Ô º¸¿©ÁÝ´Ï´Ù.
¸¸ÀÏ, egrep °°Àº ÇÁ·Î±×·¥À» © ¶§, ù¹øÂ° ÀÎÀÚ(Á¤±ÔÇ¥Çö½Ä)¸¦
ÀÏÀÏÀÌ C·Î ÆÄ½Ì ÇÏ¿© ó¸®ÇÏ´Â °ÍÀº °ÅÀÇ »ç¶÷ÀÇ Àγ»¼ºÀÇ ÇѰ踦
½ÇÇèÇÏ´Â °ÍÀÌ µÉ °ÍÀÔ´Ï´Ù. ÀÌ·² ¶§ ¹Ì¸® Â¥³õÀº regex ÇÔ¼ö¸¦
ÀÌ¿ëÇÏ¿© ÇØ´ç Æã¼Ç¿¡¼ ù¹øÂ° ÀÎÀÚ¿Í ÇØ´çÆÄÀÏÀ» ÀÐÀº ¹®ÀÚ¿À»
³Ñ°ÜÁÖ¸é ¾Ë¾Æ¼ °Ë»ö ¹× ÆÐÅÏ ¸ÅĪÀ» ÇØÁֹǷΠ¾ÆÁÖ °£ÆíÇϰÔ
ÇÁ·Î±×·¡¹Ö ÇÒ ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.
</para>
<para>
Á¤±ÔÇ¥Çö½Ä¿¡µµ »ó´çÈ÷ ¸¹Àº ÇüÅÂÀÇ ¹®¹ýÀÌ ÀÖ´Ù´Â °ÍÀº õõÈ÷
º¸¿©µå¸®µµ·Ï ÇÏ °Ú½À´Ï´Ù. ±×¸®°í °Á ¸¶Áö¸·¿¡ °¡´ÉÇÏ´Ù¸é,
Á¤±ÔÇ¥Çö½ÄÀ» ÀÌ¿ëÇÏ´Â °£´ÜÇÑ ±â´ÉÀÇ egrep ¹öÁ¯À» ¸¸µé¾î
º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
</para>
<para>
ÀÚ, ±×·³ ÀÌÁ¦ ¼³¸í¿¡ µé¾î°¡º¼±î¿ä..
</para>
</abstract>
<section>
<title>Á¤±ÔÇ¥Çö½Ä ¹®¹ý</title>
<para>
Á¤±ÔÇ¥Çö½ÄÀº ¾î¶² ¹®ÀÚ¿ÀÇ ÁýÇÕÀ» ¹¦»çÇÏ´Â ÅØ½ºÆ® ½ºÆ®¸µÀÔ´Ï´Ù.
¿ÀÆÛ·¹ÀÌÅÍ´Â '['³ª '*'°°Àº ÇѰ³ ÀÌ»óÀÇ ¹®ÀÚ¿Í ¸ÅĪµÇ´Â
Á¤±ÔÇ¥Çö½Ä¾È¿¡ ÀÖ´Â ¹®ÀÚÀÔ´Ï´Ù.
ÀϹÝÀûÀ¸·Î ´ëºÎºÐÀÇ ¹®ÀÚ´Â 'a'³ª 'z'¿Í °°ÀÌ ±× ÀÚü·Î¼ÀÇ
¹®ÀÚ±×·¡·ÎÀÇ ¶æÀ» °¡Áý´Ï´Ù. À̰ÍÀ» ¿©±â¼´Â "±×³É¹®ÀÚ(ordinary) ¶Ç´Â
ÀϹݹ®ÀÚ"¶ó°í ÇϰڽÀ´Ï´Ù. À̿ʹ ¹Ý´ë·Î '.'¿Í °°ÀÌ Æ¯¼öÇÑ ¶æÀ»
³ªÅ¸³»´Â ¹®ÀÚ¸¦ "Ư¼ö¹®ÀÚ(special)" ¶ó°í ºÎ¸£°Ú½À´Ï´Ù.
¾î¶² ¹®ÀÚ°¡ Ư¼ö¹®ÀÚÀÎÁö ¶Ç´Â ±×³É¹®ÀÚÀÎÁö´Â ´Ù¾çÇÑ Á¤±ÔÇ¥Çö½ÄÀÇ
¹®¹ý°ú ÇØ´ç Á¤±ÔÇ¥Çö½Ä¿¡¼ÀÇ ¹®¸Æ¿¡ µû¶ó ´Þ¶óÁý´Ï´Ù.
ÀÌÁ¦, ¾Æ·¡¿¡¼ ÀÚ¼¼ÇÏ°Ô À̾߱â ÇϰڽÀ´Ï´Ù.
</para>
<section>
<title>¹®¹ý ºñÆ®</title>
<para>
Á¤±ÔÇ¥Çö½Ä¿¡¼ ¾î¶² ƯÁ¤ÇÑ ¹®¹ýÀº ¸î¸îÀÇ ¹®ÀÚµéÀ» Ç×»ó Æ¯¼ö¹®ÀÚ·Î
Ãë±ÞÇϰí, ´Ù¸¥ ¹®¹ýÀº °¡²û Ư¼ö¹®ÀÚ·Î Ãë±ÞÇϸç, ¶Ç´Ù¸¥ ¹®¹ýÀº
±×·¯ÇÑ ¹®ÀÚµéÀ» ÀϹݹ®ÀÚ·Î Ãë±ÞÇÒ °æ¿ì°¡ ÀÖ½À´Ï´Ù.
ÁÖ¾îÁø Á¤±ÔÇ¥Çö½Ä¿¡¼ Regex°¡ ÀνÄÇϴ ƯÁ¤ÇÑ ¹®¹ýÀº ÇØ´ç
Á¤±ÔÇ¥Çö½ÄÀÇ ÆÐÅϹöÆÛÀÇ syntax Çʵ忡 µû¶ó ´Ù¸¨´Ï´Ù. ÀÌ ¸»Àº À§ÀÇ
¿¹¿¡¼ Á¤±ÔÇ¥Çö½Ä Áß¿¡¼ "[:alpha:]"°°Àº °ÍµéÀÌ ÀÌ ÆÐÅÏÀ» ´Ù·ç´Â
¹öÆÛÁß¿¡¼ syntax Çʵ忡 µû¶ó Ʋ¸° ¹®¹ýÀ¸·Î Ä¡ºÎµÉ ¼öµµ ÀÖ°í,
±×³É ¹«½ÃÇÏ°í ³Ñ¾î°¥ ¼öµµ ÀÖÀ¸¸ç, ¿Ã¹Ù¸£°Ô ÀÛµ¿ÇÒ ¼öµµ ÀÖ´Ù´Â
À̾߱âÀÔ´Ï´Ù. µû¶ó¼ syntax Çʵ带 Á¶Á¤ÇØÁÜÀ¸·Î½á Á¤±ÔÇ¥Çö½ÄÀÇ
±â´ÉÀ» ´Ù¾çÇÏ°Ô Á¦ÇÑÇϰí È®ÀåÇÒ ¼ö ÀÖ´Ù´Â À̾߱Ⱑ µÇ°Ú³×¿ä.
ÆÐÅÏ ¹öÆÛ´Â "[a-g]*"¿Í °°Àº Á¤±ÔÇ¥Çö½ÄÀ» µÚ¿¡¼ ¼³¸íÇÏ´Â
Á¤±ÔÇ¥Çö½Ä "ÄÄÆÄÀÏ" ÇÔ¼ö¿¡ ÀÎÀÚ·Î ³Ñ°ÜÁÜÀ¸·Î ¸¸µé¼ö ÀÖ½À´Ï´Ù.
(Âü°í·Î, ¿©±â¼ "ÄÄÆÄÀÏ"À̶óÇÔÀº, ÅØ½ºÆ® ½ºÆ®¸µ ÇüÅÂÀÇ Á¤±ÔÇ¥Çö½ÄÀ»
°Ë»ö,¸ÅĪ ÇÒ¼ö ÀÖ´Â ÇüÅ·Π¸¸µé±â À§ÇØ ¾î¶² ¹öÆì(ÆÐÅÏ ¹öÆÛ)¿¡ ¹ø¿ªÀ»
Çϰųª ÀÌ¿¡ ÇÊ¿äÇÑ °¢Á¾ °ªÀ» ´ã¾ÆµÎ´Â ¿ªÇÒÀ» ÇÏ´Â °ÍÀ» À̾߱âÇÕ´Ï´Ù. )
syntax Çʵå´Â ´Ù¾çÇÑ ºñÆ®µéÀÇ Á¶ÇÕÀ¸·Î ±¸¼ºµÇ¸ç, ÀÌ·¯ÇÑ ºñÆ®µéÀ» º¸Åë,
"¹®¹ý ºñÆ®"¶ó°í ºÎ¸¨´Ï´Ù. ÀÌ·¯ÇÑ ¹®¹ý ºñÆ®´Â "¾î¶² ¹®ÀÚ°¡ ¾î¶²
¿ÀÆÛ·¹ÀÌÅͰ¡ µÉ°ÍÀΰ¡"ÇÏ´Â ¹®Á¦¸¦ °áÁ¤ÇÏ°Ô µË´Ï´Ù.
ÀÌÁ¦, ¹®¹ý ºñÆ®ÀÇ ¸ðµç °ÍÀ» ¾ËÆÄºª ¼ø¼·Î ¼³¸íÀ» µå¸®°Ú½À´Ï´Ù.
Âü°íÀûÀ¸·Î, À̰ÍÀº "regex.h"¿¡ ÀÚ¼¼È÷ ¼³¸íµÇ¾î ÀÖ´Â
°ÍÀ¸·Î "RE_"·Î Á¤ÀǵǾî ÀÖ½À´Ï´Ù.
¾ð¶æ Á¤ÀÇµÈ À̸§¸¸À¸·Îµµ ±× ±â´ÉÀ» ÃæºÐÈ÷ ¿¹°ßÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
</para>
<para>
<variablelist>
<varlistentry>
<term>RE_BACKSLASH_ESCAPE_IN_LISTS (¸®½ºÆ®¿¡¼ ¹é½½·¡½¬´Â À̽ºÄÉÀÌÇÁ)</term>
<listitem>
<para>
ÀϹÝÀûÀÎ ¸®½ºÆ® ¿ÀÆÛ·¹ÀÌÅÍÀÎ '[', ']'¾È¿¡¼ '\'(À̽ºÄÉÀÌÇÁ)¹®ÀÚ´Â
µÞ±ÛÀÚ¸¦ À̽ºÄÉÀÌÇÁÇÏ´Â Å»Ãâ¹®ÀÚ°¡ µÈ´Ù´Â À̾ßÁöÀÌÁö¿ä. ¸¸ÀÏ
ÀÌ ºñÆ®°¡ ¼¼ÆÃµÇÁö ¾ÊÀ¸¸é ¸®½ºÆ® ¿ÀÆÛ·¹ÀÌÅ;ȿ¡¼ÀÇ '\'´Â
±×³É¹®ÀÚ(=ÀϹݹ®ÀÚ)°¡ µË´Ï´Ù. º¸Åë, ¸®½ºÆ® ¿ÀÆÛ·¹ÀÌÅÍ ¾ÈÀÇ ¹®ÀÚ´Â
Ư¼ö¹®ÀÚ ¼º°ÝÀ» »ó½ÇÇÏ°í ±×³É¹®ÀÚ°¡ µÇ´Â °Ô ÀϹÝÀûÀÔ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>RE_BK_PLUS_QM ('\+', '\?')</term>
<listitem>
<para>
ÀÌ ºñÆ®°¡ ¼³Á¤µÇ¸é '\+'´Â "ÇϳªÀÌ»óÀ» ¸ÅνÃŰ´Â
¿ÀÆÛ·¹ÀÌÅÍ(ÀÌÈÄ ÇϳªÀÌ»ó ¿ÀÆÛ·¹ÀÌÅÍ)(match-one-or-more operator)"°¡
µÇ¸ç, '\?'´Â "0°³ ÀÌ»óÀ» ¸ÅνÃŰ´Â ¿ÀÆÛ·¹ÀÌÅÍ (ÀÌÈÄ »½°³ÀÌ»ó (^^;)
¿ÀÆÛ·¹ÀÌÅÍ)"(match-zero-or-more operator)ÀÌ µË´Ï´Ù. ÀÌ ºñÆ®°¡
¼³Á¤µÇÁö ¾ÊÀ¸¸é, °¢°¢ '+'¿Í '?'°¡ ±× ¿ªÇÒÀ» ´ë½ÅÇÕ´Ï´Ù.
ÀϹÝÀûÀ¸·Î´Â º¸Åë, '+', '?'°¡ °¢°¢ ÇϳªÀÌ»ó, 0°³ ÀÌ»óÀ» ¸ÅνÃŰ´Â
¿ÀÆÛ·¹ÀÌÅÍ·Î ÀÛµ¿À» ÇÕ´Ï´Ù. ¸¸ÀÏ RE_LIMITED_OPS °¡ ¼¼ÆÃµÇ¾ú´Ù¸é
ÀÌ ºñÆ®´Â ¼¼ÆÃÇÏÁö ¸¶¼Å¾ß ÇÕ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>RE_CHAR_CLASSES (¹®ÀÚ Å¬·¡½º)</term>
<listitem>
<para>
ÀÌ ºñÆ®°¡ ¼¼ÆÃµÇ¾î ÀÖÀ¸¸é ¸®½ºÆ®¾È¿¡¼ ¹®ÀÚŬ·¡½º ¿ÀÆÛ·¹ÀÌÅ͸¦
»ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ±×·¸Áö ¾ÊÀ¸¸é »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.
À§¿¡¼ ¿¹¸¦ µç, egrep ÀÇ °æ¿ì¿¡´Â ¸®½ºÆ®¾È([..])¿¡¼ ¹®ÀÚ Å¬·¡½º
([:alnum:])À» »ç¿ëÇÒ ¼ö ÀÖ¾úÀ¸¹Ç·Î ÀÌ ºñÆ®°¡ ¼¼ÆÃµÇ¾î ÀÖ´Ù´Â
°ÍÀ» ¹Ì·ç¾î ÁüÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>RE_CONTEXT_INDEP_ANCHORS</term>
<listitem>
<para>
ÀÌ ºñÆ®°¡ ¼¼ÆÃµÇ¾î ÀÖ´Ù¸é, '^'¿Í '$'´Â ¸®½ºÆ® ¹Û¿¡¼ÀÇ
¾îµð¿¡¼³ª Ư¼ö¹®ÀÚ·Î Ãë±ÞÇϸç, ±×·¸Áö ¾Ê´Ù¸é È®½ÇÇÑ ¹®¸Æ¿¡¼¸¸
Ư¼ö¹®ÀÚ·Î Ãë±ÞÇÕ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>RE_CONTEXT_INDEP_OPS</term>
<listitem>
<para>
ÀÌ ºñÆ®°¡ ¼¼ÆÃµÇ¾î ÀÖÀ¸¸é, ¸®½ºÆ® ¹Û¿¡¼ ¾îµð¼´øÁö "È®½ÇÇÑ ¹®ÀÚ"µéÀº
Ư¼ö¹®ÀÚ·Î Ãë±ÞµË´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é ±×·¯ÇÑ ¹®ÀÚµéÀº ´ÜÁö ¾î¶²
¹®¸Æ¿¡¼¸¸ Ư¼ö ¹®ÀÚÀÌ°í ´Ù¸¥ °÷¿¡¼´Â ±×³É¹®ÀÚ·Î Ãë±ÞµË´Ï´Ù.
ƯÈ÷, ÀÌ ºñÆ®°¡ ¼¼ÆÃµÇÁö ¾ÊÀº »óÅÂÀÇ '*' ¿Í RE_LIMITED_OPS°¡
¼³Á¤µÇÁö ¾Ê¾ÒÀ» ¶§ÀÇ '+'¿Í '?'(¶Ç´ÂRE_BK_PLUS_QMÀÌ ¼³Á¤µÇ¾úÀ»
¶§ÀÇ '\+', '\?')´Â, Á¤±ÔÇ¥Çö½ÄÀÇ Ã³À½(¿¹:*foo)À̳ª
¿ÀDZ׷쿬»êÀÚ('(')³ª ´ëü ¿¬»êÀÚ('|')ÀÇ ¹Ù·ÎµÚ(¿¹: (*.., |*)¿¡ ¿ÀÁö
¾ÊÀ» ¶§¿¡¸¸ À̰ÍÀ» ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍ·Î Ãë±ÞÇÕ´Ï´Ù.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</section>
<section>
<title>¹Ì¸® Á¤ÀÇµÈ ¹®¹ý</title>
<para>
À̹ø¿¡ »ìÆìº¼ °ÍÀº "regex.h" ¿¡¼ Á¤ÀÇµÈ Áß¿ä ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¹®¹ý ½ºÅ¸ÀÏÀ»
Á¤ÀÇÇØµÐ ºÎºÐÀÔ´Ï´Ù. ¿©±â¼ ±âÁØÀÌ µÇ´Â ÇÁ·Î±×·¥Àº, GNU Emacs, POSIX Awk,
traditional Awk, Grep, Egrep µîÀ̸ç, POSIX ±âº»°ú È®Àå Á¤±ÔÇ¥Çö½ÄÀÌ Á¤Àǵ˴ϴÙ.
<screen>
#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)
</screen>
</para>
</section>
<section>
<title>¹é½½·¡½¬ ¹®ÀÚ</title>
<para>
'\'¹®ÀÚ´Â 4°¡ÁöÀÇ ¼·Î ´Ù¸¥ ¶æÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ±× Àǹ̴Â
ÇöÀçÀÇ ¹®¸Æ°ú ¾î¶² ¹®¹ý ºñÆ®°¡ ¼¼Æ®µÇ¾î Àִ°¡¿¡ µû¶ó ´Ù¸¨´Ï´Ù.
±× ¶æÀº 1) ±×³É¹®ÀÚ, 2) ´ÙÀ½¹®ÀÚ¸¦ ÀοëÇÏ´Â ¿ªÇÒ,
3) ¿ÀÆÛ·¹ÀÌÅ͸¦ µµÀÔÇÏ´Â ÀǹÌ, 4) ¾Æ¹«¶æ ¾øÀ½ÀÇ ÀǹÌÁßÀÇ Çϳª°¡ µË´Ï´Ù.
</para>
<para>
<orderedlist>
<listitem>
<para>
¹®¹ý ºñÆ®°¡ RE_BACKSLASH_ESCAPE_IN_LISTS °¡ ¼¼Æ®µÇÁö ¾ÊÀº »óÅ¿¡¼
¸®½ºÆ®¾È¿¡ ÀÖÀ» ¶§´Â ÀϹݹ®ÀÚ°¡ µË´Ï´Ù. ¿¹¸¦ µé¾î, '[\]'´Â '\'°ú
¸ÅĪÀÌ µË´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
¾Æ·¡¿¡ ¼³¸íÇÏ´Â µÎ°¡Áö ÁßÀÇ Çϳª·Î »ç¿ëµÉ ¶§¿¡´Â ´ÙÀ½ ±ÛÀÚ¸¦ À̽ºÄÉÀÌÇÁ
ÇÏ°Ô µË´Ï´Ù. ¹°·Ð ´ÙÀ½±ÛÀÚ°¡ Ư¼ö¹®ÀÚÀ̸é ÀϹݹ®ÀÚÀÇ Àǹ̸¦ °¡Áö°Ô ÇÕ´Ï´Ù.
<screen>
¸®½ºÆ®ÀÇ ¹Û¿¡ ÀÖÀ» ¶§
¸®½ºÆ®ÀÇ ¾È¿¡ ÀÖ°í ¹®¹ýºñÆ®°¡ RE_BACKSLASH_ESCAPE_IN_LISTS°¡ ¼¼Æ®µÇ¾î ÀÖÀ» ¶§
</screen>
</para>
</listitem>
<listitem>
<para>
¾î¶² ƯÁ¤ÇÑ ¹®¹ýºñÆ®°¡ ¼¼Æ®µÇ°í È®½ÇÇÑ ÀϹݹ®ÀÚ°¡ µÚµû¶ó ¿Ã¶§ ±×°ÍÀº
¿ÀÆÛ·¹ÀÌÅ͸¦ Àü°³ÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. À§¿¡¼ ¼³¸íÇÑ RE_BK_PLUS_QM,
RE_NO_BK_BRACES, RE_NO_BK_VAR, RE_NO_BK_PARENS, RE_NO_BK_REF¸¦ ÂüÁ¶Çϼ¼¿ä.
<screen>
'\b' ´Â ´Ü¾î¿¡¼ÀÇ °æ°è¸¦ Áþ´Â °Í°ú ¸ÅĪµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
'\B' ´Â ´Ü¾î³»ºÎ¿Í ¸ÅĪµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
'\<' ´Â ´Ü¾îÀÇ ½ÃÀÛ°ú ¸ÅĪµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
'\>' ´Â ´Ü¾îÀÇ ³¡°ú ¸ÅĪµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
'\w' ´Â ´Ü¾îÀÇ ±¸¼º°ú °ü·ÃµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
'\W' ´Â ºñ´Ü¾î ±¸¼º°ú °ü·ÃµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
'\'' ´Â ¹öÆÛÀÇ ½ÃÀÛ°ú ¸ÅĪµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
'\'' ´Â ¹öÆÛÀÇ ³¡°ú ¸ÅĪµÇ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
</screen>
Regex°¡ emacs ½Éº¼·Î Á¤ÀÇµÈ »óÅ·ΠÀü󸮵Ǿî ÄÄÆÄÀϵȴٸé,
'\sclass'´Â ¹®¹ý»óÀÇ Å¬·¡½º¿Í ¸ÅĪµÇ´Â ¿ÀÆÛ·¹ÀÌÅ͸¦ ³ªÅ¸³»°í,
'\Sclass'´Â ¹®¹ý»ó ºñ Ŭ·¡½º ¿ÀÆÛ·¹ÀÌÅ͸¦ ³ªÅ¸³À´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
´Ù¸¥ ¸ðµç °æ¿ì¿¡, Regex ´Â '\'¸¦ ¹«½ÃÇÕ´Ï´Ù. ¿¹¸¦ µéÀÚ¸é, '\n'Àº
'n' °ú ¸ÅĪµË´Ï´Ù.
</para>
</listitem>
</orderedlist>
</para>
</section>
</section>
<section>
<title>°øÅëÀûÀÎ ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
¿ÀÆÛ·¹ÀÌÅͶó ÇÔÀº ¾Õ¼µµ ¸»¾¸µå·ÈÁö¸¸ Á¤±ÔÇ¥Çö½Ä¿¡¼ »ç¿ëÇÏ´Â '*' ³ª '[' °°Àº
°ÍÀ» ¸»ÇÕ´Ï´Ù. Á¤±ÔÇ¥Çö½ÄÀ» Áö¿øÇÏ´Â awk, sed, vi, emacs¿¡¼ ÀÌ·± ±â´ÉÀ» »ç
¿ëÇØº¸½Å ºÐÀº ¾ó¸¶³ª Æí¸®ÇÏ°í °·ÂÇÑ ±â´ÉÀ» Á¦°øÇÏ´Â Áö ÃæºÐÈ÷ °æÇèÇØº¸¼ÌÀ»
°Ì´Ï´Ù. »ç½Ç À¯´Ð½º´Â ÅØ½ºÆ® 󸮿¡¼ Ź¿ùÇÑ ´É·ÂÀ» º¸¿©ÁÖ°í ÀÖ°í, À¯´Ð½ºÀÇ
ÀÌ·± ÀåÁ¡À» µû¿Â ¸®´ª½ºµµ ¸¶Âù°¡Áö·Î Áö¿øÀ» ÇÏ´Â ±â´ÉÀÔ´Ï´Ù. µû¶ó¼, Á¤±Ô
Ç¥Çö½Ä¿¡ ´ëÇÑ ±âº»ÀûÀÎ Áö½ÄÀº ¹Ýµå½Ã ÀÍÇôµÎ½Ã´Â °ÍÀÌ ÁÁ½À´Ï´Ù. Çѵαºµ¥ÀÇ
ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó °ÅÀÇ ¸ðµç ÅØ½ºÆ® ó¸® ÇÁ·Î±×·¥µéÀº Á¤±ÔÇ¥Çö½ÄÀ» ÀÌ¿ë
ÇÏ´Â ÅØ½ºÆ® ÆÐÅÏ ¸ÅĪÀ» ¼öÇàÇϱ⠶§¹®ÀÔ´Ï´Ù.
</para>
<para>
ÀϹÝÀûÀ¸·Î vi¿¡¼ ´ÙÀ½°ú °°Àº ¸í·ÉÀ» ¸¹ÀÌ »ç¿ëÇÏ½Ç °ÍÀÔ´Ï´Ù.
¾Æ·¡¿Í °°Àº µ¥ÀÌÅͺ£À̽º°¡ ÀÖ´Ù°í °¡Á¤ÇϰڽÀ´Ï´Ù. ¿©±â¿¡¼ ¾ÕºÎºÐÀÇ ¿ìÆí¹ø
È£ºÎºÐ¸¸À» ¹®¼³»¿¡¼ »èÁ¦ÇÏ°í ½Í´Ù°í ÇÏ¸é ´ÙÀ½°ú °°ÀÌ °£´ÜÇÏ°Ô ÇÒ ¼ö ÀÖ
½À´Ï´Ù.
<screen>
100-011 ¼¿ï½Ã Áß±¸ Ãæ¹«·Î1°¡ 02 Ãæ¹«·Î1°¡
100-012 ¼¿ï½Ã Áß±¸ Ãæ¹«·Î2°¡ 02 Ãæ¹«·Î2°¡
:%s/^[0-9]*-[0-9]* //
...............
</screen>
¹Ø¿¡ '..' µÈ ºÎºÐÀÌ Á¤±ÔÇ¥Çö½ÄÀ̰í, Á¤±ÔÇ¥Çö½ÄÀº ¿ÀÆÛ·¹ÀÌÅÍÀÇ ÁýÇÕÀ¸·Î ±¸¼º
µË´Ï´Ù. ´ëü·Î, ¿ÀÆÛ·¹ÀÌÅ͵éÀº Çϳª¸¸À¸·Î µÈ °Íµé(¿¹: '*')°ú '\'´ÙÀ½¿¡ ÇѱÛ
ÀÚ°¡ µû¶ó¿À´Â ÇüÅ·ΠµÇ¾î ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, '('³ª '\('´Â ¿ÀÇÂ±×·ì ¿ÀÆÛ·¹
ÀÌÅÍÀÔ´Ï´Ù. (¹°·Ð À̰ÍÀº ¹®¹ý ºñÆ®°¡ RE_BK_PARENS°¡ ¼¼ÆÃµÇ¾î ÀÖ´Â °¡¿¡ µû¶ó
´Þ¶óÁý´Ï´Ù.)
</para>
<para>
´ëºÎºÐÀÇ ¿ÀÆÛ·¹ÀÌÅÍ´Â ¸®½ºÆ® ('[', ']')¾È¿¡¼´Â ±× Ư¼öÇÑ Àǹ̸¦ »ó½ÇÇÕ´Ï´Ù.
±×·³, ÀÌÁ¦ °¢°¢ÀÇ ¿ÀÆÛ·¹ÀÌÅ͵éÀ» Çϳª¾¿ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù.
</para>
<section>
<title>ÀÚ½ÅÀ» ¸ÅνÃŰ´Â ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
À̰ÍÀº ±×³É ÀϹݹ®ÀÚ¸¦ ¸»ÇÕ´Ï´Ù. 'f'´Â 'f'¿Í ¸ÅεÇÁö 'ff'¿Í ¸ÅεÇÁö´Â
¾Ê½À´Ï´Ù.
</para>
</section>
<section>
<title>¾Æ¹«°Å³ª Çѹ®ÀÚ ¿ÀÆÛ·¹ÀÌÅÍ (.)</title>
<para>
'.'Àº ¾Æ¹«·± ¹®ÀÚ ÇѰ³¿Í ¸ÅĪµË´Ï´Ù. ´Ü, Ư¼öÇÑ °æ¿ì·Î ´ÙÀ½°ú °°Àº
°æ¿ì¿¡ ÇØ´ç¹®ÀÚ´Â ¸ÅĪµÉ ¼ö ¾ø½À´Ï´Ù.
<screen>
´º¶óÀι®ÀÚ : ¹®¹ýºñÆ®°¡ RE_DOT_NEWLINEÀÌ ¼¼ÆÃµÇ¾î ÀÖÁö ¾ÊÀ»¶§
³Î : ¹®¹ýºñÆ®°¡ RE_DOT_NOT_NULL ÀÌ ¼¼Æ®µÇ¾î ÀÖÀ» ¶§
¿¹) 'a.b'´Â 'acb', 'a.b', 'azb'µî°ú ¸ÅĪµË´Ï´Ù.
</screen>
</para>
</section>
<section>
<title>¿¬°á ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
ÀÌ ¿ÀÆÛ·¹ÀÌÅÍ´Â µÎ°³ÀÇ Á¤±ÔÇ¥Çö½Ä, a¿Í b¸¦ ¿¬°áÇÕ´Ï´Ù. Áï, 'ab'´Â 'a'´ÙÀ½¿¡
¹Ù·Î 'b'°¡ µû¶ó¿À´Â °ÍÀ» ³ªÅ¸³»´Â °ÍÀ¸·Î, Á¤±ÔÇ¥Çö½Ä 'ab'´Â Á¤±ÔÇ¥Çö½Ä 'a'
¿Í 'b'¸¦ ¿¬°áÇÑ °ÍÀÔ´Ï´Ù. µû¶ó¼, »ç½Ç ¿¬°á ¿ÀÆÛ·¹ÀÌÅÍ´Â °³³äÀûÀ¸·Î¸¸ ÀÖÀ»
»ÓÀÌÁö ¾î¶² ÇüÅ´ ¶ç°í ÀÖÁö ¾Ê½À´Ï´Ù. ±»ÀÌ, ÇüŸ¦ ³ªÅ¸³½´Ù°í Çϸé, 'ab'Áß
'a'¿Í 'b'»çÀÌÀÇ ºó¹®ÀÚ(empty character)°¡ ¿¬°á ¿ÀÆÛ·¹ÀÌÅͶó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
</section>
<section>
<title>¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍ´Â Á¤±ÔÇ¥Çö½Ä Áß ¾î¶² Ç¥Çö½ÄÀÇ ÇüŸ¦ ¹Ýº¹ÀûÀ¸·Î ³ªÅ¸³»´Â µ¥
»ç¿ëµÇ´Â °ÍÀ¸·Î, ÀϹÝÀûÀ¸·Î '*'(»½°³ÀÌ»ó¸ÅĪ), '+'(ÇѰ³ÀÌ»ó¸ÅĪ), '?'(»½°³³ª
ÇѰ³¸ÅĪ), '{', '}'(ƯÁ¤ÇÑ ¹Ýº¹ Ƚ¼ö ÁöÁ¤-°£°Ý¿ÀÆÛ·¹ÀÌÅÍ)°¡ ÀÖ½À´Ï´Ù.
</para>
<section>
<title>0°³ ÀÌ»ó ¸ÅĪ ¿ÀÆÛ·¹ÀÌÅÍ (*)</title>
<para>
ÀÌ ¿¬»êÀÚ´Â ÇØ´ç ½ºÆ®¸µÀ» Á¤±ÔÇ¥Çö½ÄÀ¸·Î ¸ÅνÃ۱â À§ÇØ °¡´ÉÇÑÇÑ °¡ÀåÀûÀº
¹Ýº¹È½¼ö(0¸¦ Æ÷ÇÔÇÏ¿©)¸¦ ¼±ÅÃÇÕ´Ï´Ù. °¡·É, ¿¹¸¦ µé¸é, 'o*' ´Â "0°³ ÀÌ»óÀ¸·Î
±¸¼ºµÈ o"¸¦ ¸ÅĪÇÕ´Ï´Ù. 'fo*'´Â 'fo'ÀÇ ¹Ýº¹ÀÌ ¾Æ´Ï¶ó 'o'ÀÇ ¹Ýº¹À»
³ªÅ¸³À´Ï´Ù. µû¶ó¼, 'fo*'´Â 'f', 'fo', foo'µî°ú ¸ÅĪµË´Ï´Ù.
´ÙÀ½°ú °°Àº °æ¿ì¿¡´Â ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍÀÇ ¿ªÇÒÀ» ¼öÇàÇÏÁö ¾Ê½À´Ï´Ù.
<itemizedlist>
<listitem>
<para>
Á¤±ÔÇ¥Çö½ÄÀÇ Ã³À½¿¡ ¿Ã °æ¿ì ('*foo')
</para>
</listitem>
<listitem>
<para>
¶óÀÎÀÇ ½ÃÀÛ°ú ¸ÅĪµÇ´Â '^'³ª, ¿ÀDZ׷ì '('³ª, ´ëü ¿ÀÆÛ·¹ÀÌÅÍÀÎ '|' ¹Ù·Î
´ÙÀ½¿¡ À§Ä¡ÇÒ °æ¿ì ('^*', '(*foo)', 'foo|*bar')
</para>
</listitem>
</itemizedlist>
À§ÀÇ °æ¿ì¿¡ ¾Æ·¡ÀÇ 3°¡Áö ´Ù¸¥ ÀÏÀÌ ÀϾ ¼ö ÀÖ½À´Ï´Ù.
<itemizedlist>
<listitem>
<para>
¹®¹ýºñÆ®°¡ RE_CONTEXT_INVALID_OPS °¡ ¼¼Æ®µÇ¾ú´Ù¸é, ±× Á¤±ÔÇ¥Çö½ÄÀº Ʋ¸°°Í
À¸·Î Ãë±ÞµË´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
RE_CONTEXT_INVALID_OPS °¡ ¼¼Æ®µÇÁö ¾Ê¾Ò°í, RE_CONTEXT_INDEP_OPS°¡ ¼¼Æ®µÇ¾ú
´Ù¸é, '*'´Â ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍ ¿ªÇÒÀ» ¼öÇàÇÕ´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
´Ù¸¥°æ¿ì´Â, '*'´Â ±×³É¹®ÀÚ(ÀϹݹ®ÀÚ)ÀÔ´Ï´Ù.
</para>
</listitem>
</itemizedlist>
</para>
<para>
'*' ÀÇ ÀÛµ¿¿ø¸®¸¦ ¿¹·Î µé¾îº¸°Ú½À´Ï´Ù.
'ca*ar' À̶ó´Â Á¤±ÔÇ¥Çö½ÄÀ¸·Î 'caaar' À̶ó´Â ¹®ÀÚ¸¦ ¸ÅĪ ½ÃŲ´Ù°í ÇÑ´Ù¸é,
'ca*ar' ÀÇ 'a*' ´Â 'caaar'ÀÇ 'aaa'¸¦ ¸ÅνÃŵ´Ï´Ù. ±×·¯³ª ¸¶Áö¸· ÀüÀÚÀÇ 'ar'
ÀÌ ÈÄÀÚÀÇ ³²Àº 'r'À» ¸ÅĪ ½ÃŰÁö ¸øÇϱ⠶§¹®¿¡ ÀÌÀü 'a*' ·Î ¸ÅĪµÈ 'aaa'Áß
¸¶Áö¸· Çϳª¸¦ °Å²Ù·Î ¹â¾Æ 'a'¸¦ Ãë¼ÒÇÔÀ¸·Î½á 'ar'À» ¸ÅνÃŵ´Ï´Ù.
<screen>
1) ca*ar => caaar (match)
^^^ ^^^^
2) ca*ar => caaar (not match)
^^ ^
3) ca*ar => caaar (one back cancle)
^^^ ^^^
4) ca*ar => caaar (match)
---^^ ---^^
</screen>
</para>
</section>
<section>
<title>ÇϳªÀÌ»ó ¿ÀÆÛ·¹ÀÌÅÍ (+)</title>
<para>
RE_LIMITED_OPS ·Î ¿ÀÆÛ·¹ÀÌÅÍ Á¦ÇÑÀ» °¡Çϸé, Regex ´Â ÀÌ ¿ÀÆÛ·¹ÀÌÅ͸¦ ÀνÄ
ÇÏÁö ¸øÇÕ´Ï´Ù. ¸¸ÀÏ RE_BK_PLUS_QM ÀÌ ¼¼ÆÃµÇ¾î ÀÖ´Ù¸é, '\+' °¡ ±× ¿ªÇÒÀ» Çϰí,
¾Æ´Ï¸é '+' °¡ µË´Ï´Ù. À̰ÍÀº ¾Õ¼ÀÇ »½°³ÀÌ»ó ¿ÀÆÛ·¹ÀÌÅÍ ('*')¿Í Àû¾îµµ
Çϳª´Â ¸ÅνÃŲ´Ù´Â Á¡À» Á¦¿ÜÇϰí´Â °°½À´Ï´Ù.
°¡·É, '+'°¡ ÀÌ ¿ÀÆÛ·¹ÀÌÅ͸é, 'ca+r' Àº 'car', 'caaaar'°ú ¸ÅĪµÇ°í, 'cr'°ú´Â
¸ÅεÇÁö ¾Ê½À´Ï´Ù.
</para>
</section>
<section>
<title>0°³³ª ÇѰ³ ¿ÀÆÛ·¹ÀÌÅÍ (?)</title>
<para>
À̰͵µ ¿ª½Ã RE_LIMITED_OPS °¡ ¼³Á¤µÇ¾î ÀÖÀ¸¸é, ÀνÄÇÏÁö ¸øÇÕ´Ï´Ù. ¾Æ¿ï·¯,
RE_BK_PLUS_QM ÀÇ ¼¼ÆÃ¿©ºÎ¿¡ µû¶ó, '\?' ³ª '?'°¡ ±× ¿ªÇÒÀ» ÇÕ´Ï´Ù.
ÀÌ ¿ÀÆÛ·¹ÀÌÅÍ´Â »½°³ÀÌ»óÀÇ ¿ÀÆÛ·¹ÀÌÅÍ¿Í ÇѰ³³ª Çϳªµµ ¸ÅνÃŰÁö ¾Ê´Â´Ù´Â
Á¡¸¸ Á¦¿ÜÇÏ¸é ºñ½ÁÇÕ´Ï´Ù. ¿¹¸¦ µé¸é, 'ca?r'Àº 'car'³ª 'cr'À» ¸ÅνÃ۰í,
´Ù¸¥ °ÍµéÀº ¸ÅεÇÁö ¾Ê½À´Ï´Ù.
</para>
</section>
<section>
<title>°£°Ý ¿ÀÆÛ·¹ÀÌÅÍ ({...})</title>
<para>
ÀÌ ¿ÀÆÛ·¹ÀÌÅ͸¦ »ç¿ëÇϸé, ƯÁ¤ ÆÐÅÏÀÇ ÃâÇöºóµµ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
RE_INTERVALS °¡ ¼¼Æ®µÇ¾î ÀÖ´Ù¸é, Regex´Â À̰ÍÀ» ÀνÄÇÕ´Ï´Ù. ¾Æ¿ï·¯ ´Ù¸¥ °Í°ú
¸¶Âù°¡Áö·Î °¡´ÉÇÑÇÑ °¡Àå ÀûÀº Ƚ¼öÀÇ ¹Ýº¹°ú ¸ÅĪµË´Ï´Ù.
RE_NO_BK_BRACES °¡ ¼¼Æ®µÇ¾ú´Ù¸é, '{', '}'°¡ ¿ÀÆÛ·¹ÀÌÅͰ¡ µÇ¸ç, ±×·¸Áö ¾Ê´Ù¸é,
'\{'¿Í '\}'°¡ ¿À·¯ÆäÀÌÅͰ¡ µË´Ï´Ù.
'{' ¿Í '}' °¡ ÇöÀçÀÇ °£°Ý ¿ÀÆÛ·¹ÀÌÅͶó°í ÇßÀ» °æ¿ì¿¡, ´ÙÀ½ÀÇ ¶æÀº ´ÙÀ½°ú °°
½À´Ï´Ù.
<screen>
r{2,5} : 2°³¿¡¼ 5°³ »çÀÌÀÇ 'r'
r{2,} : 2°³ ÀÌ»óÀÇ 'r'
r{4} : Á¤È®È÷ 4°³ÀÇ 'r'
</screen>
´ÙÀ½ÀÇ °æ¿ì¿¡´Â Ʋ¸° °ÍÀÌ µË´Ï´Ù.
<itemizedlist>
<listitem>
<para>
ÃÖ¼ÒÇÑ°è °¹¼ö°¡ ÃÖ´ëÇÑ°è °¹¼öº¸´Ù Ŭ °æ¿ì
</para>
</listitem>
<listitem>
<para>
°£°Ý ¿ÀÆÛ·¹ÀÌÅÍ ¾ÈÀÇ ¼ýÀÚ°¡ RE_DUP_MAX ÀÇ ¹üÀ§¸¦ ¹þ¾î³¯ °æ¿ì
</para>
</listitem>
</itemizedlist>
</para>
<para>
¸¸¾à, °£°Ý Ç¥Çö½ÄÀÌ À߸ø ÀÛ¼ºµÇ¾î ÀÖ°í, ¹®¹ýºñÆ®°¡ RE_NO_BK_BRACES °¡ ¼¼Æ®
µÇ¾î ÀÖÀ» °æ¿ì¿¡´Â, Regex ´Â °£°Ý ¿ÀÆÛ·¹ÀÌÅÍ ¾È¿¡ ÀÖ´Â ¸ðµç ¹®ÀÚ´Â ±×³É¹®ÀÚ
(ÀϹݹ®ÀÚ)·Î À籸¼ºÇÕ´Ï´Ù. ÀÌ ºñÆ®°¡ ¼¼Æ®µÇ¾î ÀÖÁö ¾Ê´Ù¸é, ±× Á¤±ÔÇ¥Çö½ÄÀº
ÁøÂ¥·Î Ʋ¸° °ÍÀÌ µË´Ï´Ù.
</para>
<para>
¶ÇÇÑ, Á¤±ÔÇ¥Çö½ÄÀÌ À¯È¿Çϱä Çѵ¥, °£°Ý ¿ÀÆÛ·¹ÀÌÅͰ¡ ÀÛµ¿ÇÒ ´ë»óÀÌ ¾øÀ» °æ¿ì,
RE_CONTEXT_INVALID_OPS °¡ ¼¼Æ®µÇ¾î ÀÖ´Ù¸é, ±× Á¤±ÔÇ¥Çö½ÄÀº Ʋ¸° °ÍÀÌ µË´Ï´Ù.
ºñÆ®°¡ ¼¼Æ®µÇ¾î ÀÖÁö ¾Ê´Ù¸é, Regex ´Â °£°Ý ¿ÀÆÛ·¹ÀÌÅÍ ¾ÈÀÇ ¸ðµç ¹®ÀÚ¸¦ ±×³É
¹®ÀÚ(ÀϹݹ®ÀÚ)·Î À籸¼ºÇϸç, ¹é½½·¡½¬´Â ±×³É ¹«½ÃÇØ¹ö¸³´Ï´Ù.
flex ·Î °£´ÜÈ÷ ¿¹¸¦ µé¾îº¸°Ú½À´Ï´Ù.
<screen>
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$
</screen>
</para>
</section>
</section>
<section>
<title>´ëü ¿ÀÆÛ·¹ÀÌÅÍ (|)</title>
<para>
RE_LIMITED_OPS ·Î ¿À·¯·¹ÀÌÅÍ¿¡ Á¦ÇÑÀ» °¡ÇÑ´Ù¸é, Regex ´Â À̰ÍÀ» ÀνÄÇÏÁö
¾Ê½À´Ï´Ù. RE_NO_BK_VBAR °¡ ¼¼Æ®µÇ¾î ÀÖ´Ù¸é, '|'°¡ À̰ÍÀ» ÀǹÌÇϰí, ±×·¸Áö
¾Ê´Ù¸é '\|'°¡ ÀÌ ¿ÀÆÛ·¹ÀÌÅ͸¦ ³ªÅ¸³À´Ï´Ù.
</para>
<para>
´ëü ¿ÀÆÛ·¹ÀÌÅÍ´Â Á¤±ÔÇ¥Çö½Ä ÁßÀÇ Çϳª¸¦ ¸ÅνÃŵ´Ï´Ù. 'foo|bar|quux'´Â
'foo'³ª 'bar' ¶Ç´Â 'quux'¿Í ¸ÅĪµË´Ï´Ù.
</para>
<para>
´ëü ¿ÀÆÛ·¹ÀÌÅÍ´Â °¡Àå ³·Àº ¿ì¼±¼øÀ§¸¦ °¡Áö±â ¶§¹®¿¡, ±×·ì ¿ÀÆÛ·¹ÀÌÅ͸¦ »ç
¿ëÇÏ¿© °ýÈ£¸¦ ¹À» ¼öµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µéÀÚ¸é, '(u|li)n(i|u)x' ´Â 'linux',
'unix' µî°ú ¸ÅĪµË´Ï´Ù.
</para>
</section>
<section>
<title>¸®½ºÆ® ¿ÀÆÛ·¹ÀÌÅÍ([...])</title>
<para>
¸®½ºÆ® ¿ÀÆÛ·¹ÀÌÅÍ´Â Çϳª ÀÌ»óÀÇ ¾ÆÀÌÅÛÀÇ ÁýÇÕÀ¸·Î µÇ¾î ÀÖ½À´Ï´Ù. ÇϳªÀÇ ¾Æ
ÀÌÅÛÀº ¹®ÀÚ(¿¹: 'a'), ¹®ÀÚ Å¬·¡½º Ç¥Çö½Ä(¿¹: '[:digit:]'), ¹üÀ§ Ç¥Çö½Ä('-')
ÀÌ µé¾î°¥ ¼ö ÀÖ½À´Ï´Ù. ¸®½ºÆ®¾È¿¡ ¾î¶² ¾ÆÀÌÅÛÀ» ÃëÇÒ ¼ö ÀÖ´Â Áö´Â
¹®¹ýºñÆ®¿¡ ¿µÇâÀ» ¹Þ½À´Ï´Ù. ºñ¾îÀÖ´Â ¸®½ºÆ® ('[]')´Â Ʋ¸° °ÍÀÌ µË´Ï´Ù.
</para>
<para>
¿¡¸¦ µé¸é, '[ab]'´Â 'a'³ª 'b'¸¦ ¸ÅνÃ۰í, '[ad]*'´Â ºó¹®ÀÚ¿À̳ª, 'a'³ª
'b'°¡ ¾Õ¼´Â ÇѰ³ÀÌ»óÀÇ ¹®ÀÚ¿°ú ¸ÅĪµË´Ï´Ù.
</para>
<para>
À̰Ͱú´Â ¹Ý´ëÀÇ Àǹ̸¦ Áö´Ï´Â °ÍÀÌ ÀÖ½À´Ï´Ù. À§ÀÇ '[..]'°¡¸®½ºÆ® ¾ÈÀÇ
Çϳª¸¦ ¸ÅνÃŰ´Â °ÍÀ̶ó¸é '[^...]'´Â ¸®½ºÆ®¾ÈÀÇ ¹®ÀÚ°¡ ¾Æ´Ñ ÇϳªÀÇ ¹®ÀÚ¿Í ¸ÅĪ
µË´Ï´Ù. '^'´Â "¶óÀÎÀÇ Ã³À½"À̶ó´Â ¿ëµµ·Î »ç¿ëµÇÁö¸¸, ¸®½ºÆ®ÀÇ Ã³À½¿¡ ¿À¸é,
ÀÌÈÄÀÇ ¹®ÀÚ°¡ ¾Æ´Ñ ÇϳªÀÇ ¹®ÀÚ¿Í ¸ÅνÃŰ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. ¾Õ¼ÀÇ ¿¹Á¦¿¡¼µµ
»ìÆìº¸¾ÒÁö¸¸, '[^a-zA-Z]'´Â ¾ËÆÄºª ¹®ÀÚ°¡ ¾Æ´Ñ ¹®ÀÚ¿Í ¸ÅĪµË´Ï´Ù. ¾Æ¿ï·¯,
ÀϹÝÀûÀÎ °æ¿ì¿¡, ¸®½ºÆ®¾È¿¡¼´Â Ư¼ö¹®ÀÚµéÀÌ ±× Àǹ̸¦ »ó½ÇÇÑ´Ù°í ¾Õ¿¡¼ ¸»
¾¸µå·È½À´Ï´Ù. µû¶ó¼, '[.*]'´Â º¸Åë '.'³ª '*' ¹®ÀÚ¸¦ ¸ÅνÃŵ´Ï´Ù.
Á¶±ÝÀÇ Æ¯¼öÇÑ °æ¿ì°¡ ÀÖ±ä ÇÕ´Ï´Ù.
<itemizedlist>
<listitem>
<para>
']' : ¸®½ºÆ®¸¦ ´Ý´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. ´Ù¸¸ '[' ´ÙÀ½¿¡ ']' °¡ ¹Ù·Î¿À¸é ±×³É
¹®ÀÚÀÔ´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
'\' : RE_BACKSLASH_ESCAPE_IN_LISTS ¹®¹ý ºñÆ®°¡ ¼¼Æ®µÇ¾ú´Ù¸é ´ÙÀ½¹®ÀÚ¸¦
À̽ºÄÉÀÌÇÁ ½ÃŰ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
'[:' : RE_CHAR_CLASSES °¡ ¼¼Æ®µÇ°í ±×µÚ¿¡ ¹®¹ý¿¡ ¸Â´Â Ŭ·¡½º À̸§ÀÌ µû¶ó
¿Â´Ù¸é ¹®ÀÚ Å¬·¡½º ¿ÀÆÛ·¹ÀÌÅͰ¡ µË´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
':]' : ¹®ÀÚ Å¬·¡½º¸¦ ´Ý´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
'-' : ¸®½ºÆ®ÀÇ Ã³À½¿¡ ¿ÀÁö ¾Ê°í (¿¹: '[-.]'), ¹üÀ§ÁöÁ¤¿¡¼ ³¡ Æ÷ÀÎÅÍ¿¡ ¿ÀÁö
¾Ê´Â ´Ù¸é(¿¹: '[a--]') ¹üÀ§ ¿ÀÆÛ·¹ÀÌÅÍÀÇ ¿ªÇÒÀ» ÇÕ´Ï´Ù.
</para>
</listitem>
</itemizedlist>
</para>
<section>
<title>¹®ÀÚ Å¬·¡½º ¿ÀÆÛ·¹ÀÌÅÍ ([:...:])</title>
<para>
À̰ÍÀº, À¯»çÇÑ ¼º°ÝÀÇ ¹®ÀÚµéÀ» »ç¿ëÀÚ°¡ ¾Ë¾Æº¸±â ½±°Ô ´Ü¾î·Î ±×·ìÀ» Áö¾î¼
»ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. C ¿¡¼ÀÇ isdigit, isalpha µî°ú °°ÀÌ ±¸¼ºÀÌ µÇ¾î ÀÖ½À´Ï´Ù.
°¡·É, '[[:alnum:]]'Àº '[a-zA-Z0-9]' ¿Í °°Àº Àǹ̸¦ °¡ÁöÁö¿ä.
»ç¿ëÇÒ ¼ö Àִ Ŭ·¡½º´Â ´ÙÀ½°ú °°½À´Ï´Ù.
<itemizedlist>
<listitem>
<para>
alnum : ¾ËÆÄºª°ú ¼ýÀÚ
</para>
</listitem>
<listitem>
<para>
alpha : ¾ËÆÄºª
</para>
</listitem>
<listitem>
<para>
blank : ½ºÆäÀ̽º³ª ÅÇ (½Ã½ºÅÛ¿¡ ÀÇÁ¸ÀûÀÓ)
</para>
</listitem>
<listitem>
<para>
cntrl : ¾Æ½ºÅ°Äڵ忡¼ÀÇ 127 ÀÌ»óÀÇ ¹®ÀÚ¿Í 32 ÀÌÇÏÀÇ Á¦¾î¹®ÀÚ
(ÇѱÛÀÇ Ã¹Â°¹ÙÀÌÆ®°¡ 127 ÀÌ»óÀ̹ǷΠÁ¦¾î¹®ÀÚ·Î Ãë±ÞµÊ :()
</para>
</listitem>
<listitem>
<para>
digit : ¼ýÀÚ
</para>
</listitem>
<listitem>
<para>
graph : ½ºÆäÀ̽º´Â Á¦¿ÜµÇ°í ³ª¸ÓÁö´Â 'print' Ç׸ñ°ú °°À½.
</para>
</listitem>
<listitem>
<para>
lower : ¼Ò¹®ÀÚ
</para>
</listitem>
<listitem>
<para>
print : ¾Æ½ºÅ°Äڵ忡¼ 32¿¡¼ 126±îÁöÀÇ ÂïÀ» ¼ö ÀÖ´Â ¹®ÀÚ
</para>
</listitem>
<listitem>
<para>
</para>
</listitem>
<listitem>
<para>
punct : Á¦¾î¹®ÀÚµµ ¾Æ´Ï°í ¾ËÆÄºª.¼ýÀÚµµ ¾Æ´Ñ ¹®ÀÚ
</para>
</listitem>
<listitem>
<para>
space : ½ºÆäÀ̽º, Äɸ®Áö ¸®ÅÏ, ´º¶óÀÎ, ¼öÁ÷ ÅÇ, ÆûÇǵå
</para>
</listitem>
<listitem>
<para>
upper : ´ë¹®ÀÚ
</para>
</listitem>
<listitem>
<para>
xdigit : 16Áø¼ö, 0-9, a-f, A-F
</para>
</listitem>
</itemizedlist>
Ŭ·¡½º ¿ÀÆÛ·¹ÀÌÅÍ´Â ¸®½ºÆ® ¾È¿¡¼¸¸ (¿¹: '[[:digit:]]') È¿·ÂÀ» ¹ßÈÖÇϰí,
±×³É '[:digit:]' ¿Í °°ÀÌ »ç¿ëÇÏ¸é ´Ù¸¥ Àǹ̸¦ °¡Áö°Ô µË´Ï´Ù.
</para>
</section>
<section>
<title>¹üÀ§ ¿ÀÆÛ·¹ÀÌÆ® (-)</title>
<para>
¹üÀ§ ¿ÀÆÛ·¹ÀÌÅÍ´Â ¸®½ºÆ® ¾È¿¡¼¸¸ ÀÛµ¿Çϸç, '-'¸¦ ¾ÕµÚ·Î ÇÑ µÎ¹®ÀÚ»çÀÌÀÇ
¸ðµç ¹®ÀÚ¸¦ ÀǹÌÇÕ´Ï´Ù. °¡·É, 'a-f'´Â 'a'¿¡¼ 'f'»çÀÌÀÇ ¸ðµç ¹®ÀÚ¸¦ Æ÷ÇÔ
ÇÕ´Ï´Ù.
<warning>
<para>
¹®ÀÚ Å¬·¡½º´Â ¹üÀ§¿¡¼ ½ÃÀÛ°ú ³¡Æ÷ÀÎÅÍ¿¡ »ç¿ëµÉ ¼ö ¾ø½À´Ï´Ù. ±×°ÍÀº
ÇϳªÀÇ ¹®ÀÚ°¡ ¾Æ´Ï¶ó ¹®ÀÚ±×·ìÀ̱⠶§¹®¿¡ ±×·¸ÁÒ.
À߸øµÈ °æ¿ì : '[[:digit:]-[:alpha:]]'
</para>
</warning>
À̿ܿ¡, ¾à°£ÀÇ Æ¯¼öÇÑ °æ¿ì°¡ ÀÖ½À´Ï´Ù.
</para>
<para>
RE_NO_EMPTY_RANGES°¡ ¼¼Æ®µÇ¾ú°í, ¹üÀ§ÀÇ ³¡ Æ÷ÀÎÅͰ¡ ½ÃÀÛÆ÷ÀÎÅͺ¸´Ù ÀÛ´Ù¸é,
(¿¹: '[z-a]') ±×°ÍÀº Ʋ¸° °ÍÀÌ µË´Ï´Ù. ÇØ´ç ¹®¹ýºñÆ®°¡ ¼¼Æ®µÇ¾î ÀÖÁö ¾Ê´Ù
¸é, ±× ¹üÀ§´Â ÅÖ ºñ°Ô ¸¸µì´Ï´Ù. ¸¸ÀÏ '-'¹®ÀÚ¸¦ ¿ø·¡ÀÇ ¹®ÀÚÀǹ̷Π¸®½ºÆ®¾È¿¡
³ÖÀ»·Á¸é, ´ÙÀ½ Áß ÇѰ¡Áö¸¦ µû¶ó¾ß ÇÕ´Ï´Ù.
<itemizedlist>
<listitem>
<para>
¸®½ºÆ®ÀÇ Ã¹ºÎºÐÀ̳ª ¸¶Áö¸·¿¡ »ðÀÔÇÑ´Ù.
</para>
</listitem>
<listitem>
<para>
¹üÀ§ÀÇ ½ÃÀÛÆ÷ÀÎÅͰ¡ '-'º¸´Ù ÀÛ°Ô Çϰí, ³¡Æ÷ÀÎÅ͸¦ '-'¿Í °°°Å³ª Å©°Ô ÇÑ´Ù.
</para>
</listitem>
</itemizedlist>
¿¹¸¦ µé¾î, '[-a-z]'´Â ¼Ò¹®ÀÚ³ª '-'¸¦ ÀǹÌÇÕ´Ï´Ù.
</para>
</section>
</section>
<section>
<title>±×·ìÈ ¿ÀÆÛ·¹ÀÌÅÍ ((...) or \(...\))</title>
<para>
Regex ¿¡¼´Â ±×·ìÀ» ÇϳªÀÇ º¸Á¶ Ç¥Çö½ÄÀ¸·Î ó¸®ÇÕ´Ï´Ù. ¸¶Ä¡ ¼öÇп¬»ê¿¡¼
'(a*(b-c)+d)/e' ¿Í °°ÀÌ ¸»ÀÔ´Ï´Ù. ¿©±â¼ ¹Ù±ùÂÊ °ýÈ£ºÎÅÍ ±×·ì1¹ø, ¾ÈÂÊ
°ýÈ£('(b-c)')°¡ ±×·ì2¹øÀÌ µË´Ï´Ù. Áï, ¿ÞÂÊ¿¡¼ ¿À¸¥ÂÊÀ¸·Î, ¹Ù±ùÂÊ¿¡¼ u
¾ÈÂÊÀ¸·Î ±×·ìÀÇ ¼ø¼°¡ ¸Å°ÜÁý´Ï´Ù. À̰ÍÀº Àá½ÃµÚ¿¡ ¼³¸íÇÒ "°Å²Ù·Î ÂüÁ¶(ÈÄÁøÂüÁ¶)"
¿ÀÆÛ·¹ÀÌÅÍ¿¡ ÀÇÇØ »ç¿ëµË´Ï´Ù. »ç½Ç, ¿¬»ê½Ä µî¿¡¼ °ýÈ£°¡ ¿¬¼ÓÀ¸·Î ³ª¿Ã°æ¿ì,
CÀÇ ÆÄ½Ì¿¡¼µµ ¿ÞÂÊ¿¡¼ºÎÅÍ °ýÈ£¸¦ ó¸®ÇÕ´Ï´Ù.
µû¶ó¼, ±×·ìÀ» »ç¿ëÇÏ¸é ´ÙÀ½ÀÇ ÀÏÀ» ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
<itemizedlist>
<listitem>
<para>
´ëü¿ÀÆÛ·¹ÀÌÅÍ ('|')³ª ¹Ýº¹¿ÀÆÛ·¹ÀÌÅÍ ('+'³ª '*')¿¡¼ ÀÎÀÚÀÇ ¹üÀ§¸¦
ÁöÁ¤ ÇÕ´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
ÁÖ¾îÁø ±×·ì°ú ¸ÅĪµÇ´Â º¸Á¶¹®ÀÚ¿ÀÇ À妽ºÀÇ ÀÚÃ븦 À¯ÁöÇÕ´Ï´Ù.
ÀÌ ±×·ì¿ÀÆÛ·¹ÀÌÅ͸¦ »ç¿ëÇϸé,
"°Å²Ù·ÎÂüÁ¶" (back-reference)¿ÀÆÛ·¹ÀÌÅ͸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
·¹Áö½ºÅ͸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
</listitem>
</itemizedlist>
ÀÌ ºÎºÐµéÀº ³ªÁß¿¡ ÀÚ¼¼È÷ ¼³¸íÇϰڽÀ´Ï´Ù.
</para>
<para>
¹®¹ýºñÆ®°¡ RE_NO_BK_PARENS °¡ ¼¼Æ®µÇ¾î ÀÖ´Ù¸é, '('¿Í ')'°¡ ±× ¿ªÇÒÀ» Çϸç,
¾Æ´Ï¸é, '\('¿Í '\)'°¡ ±× ¿ªÇÒÀ» ÇÕ´Ï´Ù. RE_UNMATCHED_RIGHT_PAREN_ORD °¡ ¼¼
Æ®µÇ¾î ÀÖ°í, '('´Â ÀÖ´Â µ¥ ')'°¡ ¾ø´Ù¸é, ')'°¡ ¸ÅĪµÈ °ÍÀ¸·Î »ý°¢ÇÏ°í ³Ñ¾î
°©´Ï´Ù.
</para>
</section>
<section>
<title>°Å²Ù·ÎÂüÁ¶ ¿ÀÆÛ·¹ÀÌÅÍ (\¼ýÀÚ)</title>
<para>
ÀÌ ¿ÀÆÛ·¹ÀÌÅÍ´Â »ç½Ç, Á¶±Ý Çò°¥¸®±â´Â ÇÏÁö¸¸ ºñ½ÁÇÑ ÆÐÅÏÀÌ ¿©·¯¹ø
³ª¿Ã°æ¿ì¿¡ »ó´çÇÑ ÆíÀǸ¦ Á¦°øÇÕ´Ï´Ù.
</para>
<para>
RE_NO_BK_REF ¹®¹ý ºñÆ®°¡ ¼¼ÆÃµÇ¾î ÀÖÁö ¾Ê´Ù¸é, ÀÌ ¿ÀÆÛ·¹ÀÌÅ͸¦
ÀνÄÇÕ´Ï´Ù. °Å²Ù·ÎÂüÁ¶ ¿ÀÆÛ·¹ÀÌÅÍ´Â ÀÌ¹Ì ±â¼úÇÑ ¾ÕÀÇ ±×·ìÀ» ¸ÅĪÇÕ´Ï´Ù.
Á¤±ÔÇ¥Çö½Ä Áß '¼ýÀÚ' ±×·ìÀ» ³ªÅ¸³»±â À§Çؼ´Â '\¼ýÀÚ'ÇüÅ·Π»ç¿ëÇÕ´Ï´Ù.
¼ýÀÚ´Â '1'¿¡¼ '9'±îÁö °¡´ÉÇϸç, À̰ÍÀº óÀ½ÀÇ 1¿¡¼ 9±îÁöÀÇ ±×·ì°ú
¸ÅĪµË´Ï´Ù.
</para>
<para>
Á¶±Ý´õ ¼¼ºÎÀûÀÎ À̾߱⸦ ÇØº¸°Ú½À´Ï´Ù.
'(a)\1' Àº 'aa'¿Í ¸ÅĪÇÕ´Ï´Ù. '\1'Àº ù¹øÂ° ±×·ìÀ» ³ªÅ¸³»¸ç,
'(a)'·Î °ýÈ£·Î µÑ·¯½ÓÀ¸·Î½á ±×·ìÀ» Ç¥½ÃÇÏ´Â °ÍÀÔ´Ï´Ù. ¸¶Âù°¡Áö·Î,
'(bana)na\1bo\1'Àº 'bananabanabobana'¿Í ¸ÅĪµË´Ï´Ù.
</para>
<para>
Á¶±Ý º¹ÀâÇÑ À̾߱⸦ ÇØº¸°Ú½À´Ï´Ù. ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍ µîÀÇ ÀÛµ¿À¸·Î ±×·ìÀÌ
Çѹø ÀÌ»ó ¸ÅĪÀÌ µÉ °æ¿ì °Å²Ù·ÎÂüÁ¶ ¿ÀÆÛ·¹ÀÌÅÍ´Â ¸¶Áö¸·À¸·Î ¸ÅĪµÈ º¸Á¶
¹®ÀÚ¿À» ¸ÅĪÇÕ´Ï´Ù. ¸»·Î¸¸ Çϸé ÀÌÇØ°¡ ¾ÈµÇ¹Ç·Î, '((a*)b)*\1\2' ¿Í
'aabababa'¿ÍÀÇ ¸ÅĪ¿©ºÎ¸¦ µûÁ®º¼±î¿ä? :) ÀÌ°Ô »ê¼ú¿¬»ê½ÄÀÌ¸é ¾ó¸¶³ª
ÁÁ°Ú½À´Ï±î¸¶´Â ¾ÈŸ±õ°Ôµµ Á¤±ÔÇ¥Çö½ÄÀ̴ϸ¸Å Á¶±Ý ÇÞ°¥¸®´õ¶óµµ Àß
»ìÆìº¸¸é ±×¸® ¾î·ÆÁö¸¸Àº ¾Ê½À´Ï´Ù. °ýÈ£ÀÇ ¼ø¼¿¡ µû¶ó ±×·ìÀº
´ÙÀ½°ú °°ÀÌ ´ëÀÀÇÕ´Ï´Ù.
<screen>
1¹ø ±×·ì
+------+
....... |
'((a*)b)*\1\2'
.... |
+--------+
2¹ø ±×·ì
</screen>
¸ÅĪµÇ´Â ¼ø¼¸¦ »ìÆìº¾½Ã´Ù. '--' ´Â ¸Å´Ü°è¿¡¼ ¼·Î ¸ÅĪµÇ´Â
ºÎºÐÀÔ´Ï´Ù.
<screen>
1) ((a*)b)*\1\2 aabababa
------- ---
2) ((a*)b)*\1\2 aabababa
- --
3) ((a*)b)*\1\2 aabababa
-- --
4) ((a*)b)*\1\2 aabababa
</screen>
¿©±â¼ »ý°¢ÇØ¾ß ÇÒÁ¡Àº 3)´Ü°èÀÇ '\1'Àº 1´Ü°èÀÇ '((a*)b)'¿Í ¸ÅĪµÇ³ª,
À̰ÍÀº ¶ÇÇÑ 2)´Ü°èÀÇ '*' ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍ¿¡ ÀÇÇØ '*'(ab)¿Í ¸ÅĪµË´Ï´Ù.
µû¶ó¼, ÃÖÁ¾ÀûÀ¸·Î '\1'Àº 'ab'¿Í ¸ÅĪµË´Ï´Ù.
¹°·Ð À§ÀÇ Ç¥Çö½ÄÀº 'aababa'¿Íµµ ¸ÅĪÀÌ µË´Ï´Ù.
<screen>
queen:~/regex$ echo "aabababa" | egrep "((a*)b)*\1\2"
aabababa
queen:~/regex$ echo "aababa" | egrep "((a*)b)*\1\2"
aababa
</screen>
</para>
<para>
'(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Àº ¸ÅĪ¿¡ °ü¿©ÇÏÁö
¾Ê±â ¶§¹®¿¡ Àüü ¸ÅĪÀº ½ÇÆÐ·Î µ¹¾Æ°©´Ï´Ù.
</para>
<para>
°Å²Ù·ÎÂüÁ¶ ¿ÀÆÛ·¹ÀÌÅ͸¦ ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍÀÇ ÀÎÀÚ·Î ¾µ¼öµµ ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¸é, '(a(b))\2*'´Â 'a'´ÙÀ½¿¡ 'b'°¡ ÇϳªÀÌ»ó ¿À´Â °Í°ú ¸ÅĪÀÌ
µË´Ï´Ù. ¾Æ¿ï·¯, '(a(b))\2{3}' Àº 'abbbb'¿Í ¸ÅĪÀÌ µË´Ï´Ù.
´ç¿¬È÷, n¹øÂ°ÀÇ º¸Á¶Ç¥ÇöÀÌ ¾ø´Ù¸é ¸ÅĪÀº ½ÇÆÐÇÏ°Ô µË´Ï´Ù.
Àç¹ÌÀÖÁö ¾Ê½À´Ï±î? ^^
</para>
</section>
<section>
<title>´é(anchoring) ¿ÀÆÛ·¹ÀÌÅÍ(^,$)</title>
<para>
´é ¿ÀÆÛ·¹ÀÌÅÍ´Â Àüü ¹®ÀÚ¿À̳ª ÇϳªÀÇ ¶óÀο¡¼ ½ÃÀÛ°ú ³¡À» ³ªÅ¸³»´Â
°ÍµéÀÔ´Ï´Ù.
</para>
<section>
<title>¶óÀνÃÀÛ ¿ÀÆÛ·¹ÀÌÅÍ(^)</title>
<para>
ÀÌ ¿ÀÆÛ·¹ÀÌÅÍ´Â ¹®ÀÚ¿ÀÇ ½ÃÀÛÀ̳ª ´º¶óÀÎ ¹®ÀÚ ´ÙÀ½ÀÇ ºó¹®ÀÚ¿¿Í
¸ÅĪÇÒ ¼ö ÀÖ½À´Ï´Ù.
´ÙÀ½ÀÇ °æ¿ì¿¡ '^'´Â ÀÌ ¿ÀÆÛ·¹ÀÌÅÍÀÇ ¿ªÇÒÀ» Çϰí, ´Ù¸¥ °æ¿ì¿¡´Â
±×³É¹®ÀÚ°¡ µË´Ï´Ù.
* '^' ÀÌ ÆÐÅÏ¿¡¼ óÀ½¿¡ À§Ä¡ÇÑ´Ù. °¡·É, '^foo' °°Àº °æ¿ì
* ¹®¹ýºñÆ®°¡ RE_CONTEXT_INDEP_ANCHORS °¡ ¼¼Æ®µÇ¾ú°í, °ñÈ£³ª ±×·ì..µîÀÇ ¹Û¿¡
ÀÖÀ» °æ¿ì
* ¿ÀDZ׷ìÀ̳ª ´ëü ¿ÀÆÛ·¹ÀÌÅÍ ´ÙÀ½¿¡ µû¶ó¿Ã °æ¿ì, ¿¹¸¦ µé¸é, 'a\(^b\)',
'a\|^b'
</para>
<para>
ÀÌ·¯ÇÑ ±ÔÄ¢Àº '^' ¸¦ Æ÷ÇÔÇÏ´Â À¯È¿ÇÑ ÆÐÅÏÀ̶ó°í ÇÏ´õ¶óµµ
¸ÅĪµÉ ¼ö ¾ø´Ù´Â °ÍÀ» ¾Ï½ÃÇÕ´Ï´Ù. ¸¸¾à, ÆÐÅÏ ¹öÆÛ¿¡¼
newline_anchor Çʵ尡 ¼¼Æ®µÇ¾ú´Ù¸é, '^'´Â ´º¶óÀÎ ´ÙÀ½°úÀÇ
¸ÅĪ¿¡ ½ÇÆÐÇÕ´Ï´Ù. À̰ÍÀº °¡²û Àüü ¹®ÀÚ¿À» ¶óÀÎÀ¸·Î ³ª´©¾î¼
ó¸®ÇÏÁö ¾ÊÀ» ¶§¿¡ À¯¿ëÇÏ´Ù°í Çϴ±º¿ä.
</para>
</section>
<section>
<title>¶óÀÎÀÇ ³¡ ¿ÀÆÛ·¹ÀÌÅÍ ($)</title>
<para>
ÀÌ ¿ÀÆÛ·¹ÀÌÅÍ´Â ¹®ÀÚ¿ÀÇ ³¡À̳ª ´º¶óÀÎ ¹®ÀÚÀÇ ÀÌÀüÀÇ ºó ¹®ÀÚ¿°ú
¸ÅĪµË´Ï´Ù. À̰ÍÀº Ç×»ó '$'·Î ³ªÅ¸³³´Ï´Ù. ¿¹¸¦ µé¸é, 'foo$'´Â
'foo\nbar'ÀÇ Ã³À½ ¼¼±ÛÀÚ¿Í ¸ÅĪÀÌ µË´Ï´Ù.
´ÙÀ½ ½Ã°£¿¡´Â GNU ¿ÀÆÛ·¹ÀÌÅÍ¿Í GNU emacs ¿ÀÆÛ·¹ÀÌÅ͸¦ Àá±ñ »ìÆìº¸°í
Àç¹ÌÀÖ´Â Regex ÇÁ·Î±×·¡¹Ö¿¡ µé¾î°¡°Ú½À´Ï´Ù.
</para>
</section>
</section>
</section>
<section>
<title>GNU ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
ÀÌ Àå¿¡¼ ¼³¸íÇÏ´Â °ÍÀº POSIX¿¡´Â Á¤ÀǵÇÁö ¾Ê¾ÒÀ¸³ª GNU ¿¡ ÀÇÇØ Á¤ÀǵÈ
¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù.
</para>
<section>
<title>¿öµå ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
¿©±â¿¡ ³ª¿À´Â ¿ÀÆÛ·¹ÀÌÅÍ´Â Regex °¡ ´Ü¾îµéÀÇ ÀϺκÐÀ» ÀνÄÇØ¾ß °¡´ÉÇÕ´Ï´Ù.
Regex ´Â ¾î´À ¹®ÀÚ°¡ ´Ü¾îÀÇ ÀϺκÐÀÎÁö ¾Æ´ÑÁö¸¦ °áÁ¤Çϱâ À§ÇØ ¹®¹ý
Å×À̺íÀ» »ç¿ëÇÕ´Ï´Ù.
</para>
<para>
»ç½Ç, ÅØ½ºÆ®¸¦ ó¸®Çϰųª °ü·ÃÀÛ¾÷À» ÇÏ´Ùº¸¸é ´Ü¾î´ÜÀ§·Î ÇÏ¿©¾ß ÇÒ ÀÛ¾÷ÀÌ
¸¹ÀÌ ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ Ç¥ÁØ POSIX¿¡¼´Â ´Ü¾î(¿öµå)´ÜÀ§ÀÇ ÀÛ¾÷¿¡ ´ëÇØ Ưº°È÷
Áö¿ø°¡´ÉÇÏ°Ô ±ÔÁ¤µÈ °ÍÀÌ ¾ø½À´Ï´Ù. ÇÏÁö¸¸ GNU ¿¡¼´Â ¾µ¸¸ÇÑ ¿öµå ´ÜÀ§ÀÇ
ÀÛ¾÷À» À¯¿ëÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖ´Â ´Ù¾çÇÑ ¿ÀÆÛ·¹ÀÌÅ͸¦ Áö¿øÇÔÀ¸·Î½á
Á¤±ÔÇ¥Çö½ÄÀ» Á»´õ °·ÂÇÏ°Ô Á¦¾îÇÒ ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù. ÀÌ·± ¿öµå
¿ÀÆÛ·¹ÀÌÅÍ´Â ¸¹ÀÌ »ç¿ëµÇ°í ÀÖÁö ¾ÊÁö¸¸ Ȱ¿ëÀ» Àß ÇÏ¸é ¾ÆÁÖ ¶È¶ÈÇÑ ÀÏÀ»
¸¹ÀÌ Ã³¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
<section>
<title>À̸ƽº°¡ ¾Æ´Ñ ¹®¹ý Å×À̺í</title>
<para>
¹®¹ý Å×À̺íÀº ÀϹÝÀûÀÎ ¹®ÀÚ¼¼Æ®ÀÇ ¹®Àڵ鿡 ÀÇÇØ À妽ºÈµÈ ÇϳªÀÇ
¹è¿ÀÔ´Ï´Ù. Regex ´Â Ç×»ó ÀÌ À妽º Å×À̺íÀ» »ç¿ëÇϱâ À§ÇØ Ç×»ó
char * º¯¼ö°ªÀ» »ç¿ëÇÕ´Ï´Ù. ¸î¸î °æ¿ì¿¡´Â ÀÌ º¯¼ö°ªÀ» ÃʱâÈÇϰí
¼ø¼´ë·Î ¿©·¯ºÐµéÀÌ ÃʱâȽÃų¼öµµ ÀÖ½À´Ï´Ù.
<itemizedlist>
<listitem>
<para>
Regex °¡ Àüó¸® ½Éº¼ emacs ·Î ÄÄÆÄÀϵǾú°í, SYNTAX_TABLE ÀÌ µÑ´Ù
Á¤ÀǵÇÁö ¾Ê¾Ò´Ù¸é, Regex ´Â re_syntax_table À» ÇÒ´çÇϰí i°¡
±ÛÀÚÀ̰ųª ¼ýÀÚ, '_' À̶ó¸é, ¿ø¼Ò i³ª SWord¸¦ ÃʱâÈÇÑ´Ù.
i°¡ ±×·¸Áö ¾Ê´Ù¸é ±× °ªÀº 0À¸·Î Ãʱâȵ˴ϴÙ.
</para>
</listitem>
<listitem>
<para>
Regex °¡ Á¤ÀǵÇÁö ¾ÊÀºemacs·Î ÄÄÆÄÀϵǾúÀ¸³ª SYNTAX_TABLE ÀÌ
Á¤ÀǵǾú´Ù¸é ¿©·¯ºÐµéÀº char * º¯¼ö re_syntax_table À»
À¯È¿ÇÑ ¹®¹ý Å×À̺í(syntax table)·Î Á¤ÀÇÇÏ¿©¾ß ÇÕ´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
Regex°¡ Àüó¸® ½Éº¼ emacs°¡ Á¤ÀÇµÈ »óÅ¿¡¼ ÄÄÆÄÀϵǾú´Ù¸é ¾î¶²
ÀÏÀÌ ÀϾ´Â Áö´Â µÚ¿¡¼ ¼³¸íÇÕ´Ï´Ù.
</para>
</listitem>
</itemizedlist>
</para>
</section>
<section>
<title>Match-word-boundary ¿ÀÆÛ·¹ÀÌÅÍ(\b)</title>
<para>
'\b' ´Â ´Ü¾î¸¦ ±¸ºÐÁþ½À´Ï´Ù. Áï, À̰ÍÀº ´Ü¾îÀÇ ½ÃÀÛ°ú ³¡ÀÇ ºó ¹®ÀÚ¿°ú ¸ÅĪ
ÀÌ µË´Ï´Ù. ¿¹¸¦ µé¸é, '\brat\b'´Â ºÐ¸®µÈ ³¹¸», 'rat'À» ¸ÅνÃŵ´Ï´Ù.
±×·¯³ª,´Ü¾îÀÇ ¹üÀ§¸¦ ¾î¶»°Ô ±ÔÁ¤Çϴ°¡ ÇÏ´Â °ÍÀº ¸î°¡Áö ¿¹Á¦·Î ÃæºÐÈ÷ À¯Ãß
ÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
</para>
<para>
ÀÌ °ÁÂÀÇ Ã³À½¿¡ µç ¿¹¸¦, ÀÌ ¿ÀÆÛ·¹ÀÌÅ͸¦ »ç¿ëÇÏ¸é ´õ °£´ÜÇÕ´Ï´Ù.
<screen>
grep "\bint\b" regex.c
mcnt = (int) Sword;
int mcnt;
.........
queen:~/regex$
</screen>
À§ÀÇ ¿¹¸¦ »ìÆìº¼ ¶§, ´Ü¾î´Â "°ø¹é¹®ÀÚ(ÈÀÌÆ®¹®ÀÚ)³ª ºÎÈ£¹®ÀÚ('(', ']', '-',
..) °¡ ³¢¾îµéÁö ¾Ê´Â ¹®ÀÚÀÇ ¿¬¼ÓµÈ ÁýÇÕ" Á¤µµ·Î »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
</section>
<section>
<title>Match-within-word Operator (\B)</title>
<para>
'B' ´Â ³¹¸»¾È¿¡¼ÀÇ ºó¹®ÀÚ¿°ú ¸ÅĪÇÕ´Ï´Ù. ¿¹¸¦ µé¸é, 'c\Brat\Be' ´Â
'create' ¿Í ¸ÅĪÇϰí, 'dirty \Brat'Àº 'dirty rat'°ú ¸ÅĪÇÏÁö ¾Ê½À´Ï´Ù.
</para>
</section>
<section>
<title>Match-beginning-of-word Operator (\<)</title>
<para>
'\<' ´Â ´Ü¾îÀÇ ½ÃÀÛ¿¡¼ ºó¹®ÀÚ¿À» ¸ÅĪÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>Match-end-of-word Operator (\>)</title>
<para>
'\>' ´Â ´Ü¾îÀÇ ³¡¿¡¼ ºó¹®ÀÚ¿°ú ¸ÅĪÇÕ´Ï´Ù.
<screen>
queen:~/regex$ grep "\<char\>" regex.c
return (char *) re_error_msg[(int) ret];
const char *s;
....
queen:~/regex$
</screen>
</para>
</section>
<section>
<title>Match-word-constituent Operator (\w)</title>
<para>
'\w' ´Â ³¹¸»À» ÀÌ·ç´Â ¾î¶² ¹®ÀÚ¿Í ¸ÅĪÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>Match-non-word-constituent Operator (\W)</title>
<para>
'\W' ´Â ³¹¸»ÀÇ ¼ººÐ¿ä¼Ò°¡ ¾Æ´Ñ ¾î¶² ¹®ÀÚ¿Í ¸ÅĪÇÕ´Ï´Ù.
<screen>
queen:~/regex$ echo " int " | grep "\Wi\wt"
int
queen:~/regex$
</screen>
'\w' °ú '.'ÀÇ Â÷ÀÌÁ¡Àº ÀüÀÚ´Â ³¹¸»¼ÓÀÇ ¾î´À Çѹ®ÀÚ(±×·¯¹Ç·Î ³¹¸»ÀÇ ±¸¼º¿ä¼Ò)
¿Í ¸ÅĪÀÌ µÇ³ª, '.'´Â À̰ÍÀú°Í µûÁöÁö ¾Ê°í ¾î´À Çѹ®ÀÚ¿Í ¸ÅĪÀÌ µÇ¹Ç·Î Á¶±Ý
ÀǹÌÀûÀ¸·Î Ʋ¸³´Ï´Ù. ¾Æ¿ï·¯, '\W'µµ ³¹¸»¼ÓÀÇ ¾î¶² ¹®ÀÚ (¿¹¸¦ µé¸é, 'int'¼ÓÀÇ
'n')°ú´Â ¸ÅĪÀÌ µÇÁö ¾ÊÀ¸¸ç ³¹¸»¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â ¾î¶² Çѹ®ÀÚ (¿¹¸¦ µé¸é, ' ')
¿Í ¸ÅĪÀÌ µË´Ï´Ù.
</para>
</section>
</section>
<section>
<title>¹öÆÛ ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
ÀÌÁ¦ ¼³¸íÇÒ °ÍÀº ¹öÆÛ¿¡¼ ÀÛµ¿ÇÏ´Â ¿ÀÆÛ·¹ÀÌÅÍÀÔ´Ï´Ù. À̸ƽº¿¡¼ÀÇ buffer´Â
"À̸ƽº buffer" ÀÔ´Ï´Ù. ´Ù¸¥ ÇÁ·Î±×·¥¿¡¼´Â Àüü ¹®ÀÚ¿À» ¹öÆÛ·Î ¿©±é´Ï´Ù.
</para>
<section>
<title>Match-beginning-of-buffer Operator (\`)</title>
<para>
'\`'´Â ¹öÆÛÀÇ ½ÃÀ۵Ǵ ºÎºÐÀÇ ºó¹®ÀÚ¿°ú ¸ÅĪµË´Ï´Ù.
</para>
</section>
<section>
<title>Match-beginning-of-buffer Operator (\')</title>
<para>
'\''´Â ¹öÆÛÀÇ ³¡ ºÎºÐÀÇ ºó¹®ÀÚ¿°ú ¸ÅĪµË´Ï´Ù.
</para>
</section>
</section>
</section>
<section>
<title>GNU À̸ƽº ¿ÀÆÛ·¹ÀÌÅÍ</title>
<para>
ÀÌÁ¦ ¼³¸íÇÒ °ÍÀº POSIX¿¡¼´Â Á¤ÀǵÇÁö ¾Ê¾Ò°í, GNU¿¡¼ Á¤ÀǵǾúÀ¸¸ç, À̰ÍÀ»
»ç¿ëÇÒ ¶§´Â Regex °¡ ÄÄÆÄÀÏ µÉ ¶§ Àüó¸® ½Éº¼À» Á¤ÀÇµÈ emacs·Î ÇÏ¿©¾ß ÇÕ´Ï´Ù.
</para>
<section>
<title>¹®¹ý Ŭ·¡½º ¿ÀÆÛ·¹ÀÌÅÍ (syntactic class operators)</title>
<para>
ÀÌ ¿ÀÆÛ·¹ÀÌÅ͵éÀº Regex °¡ ÀÌ ¹®¹ý ¹®ÀÚµéÀÇ Å¬·¡½º¸¦ ÀνÄÇÏ¿©¾ß ÇÕ´Ï´Ù.
Regex ´Â À̰ÍÀ» °Ë»çÇϱâ À§ÇØ ¹®¹ý Å×À̺íÀ» »ç¿ëÇÕ´Ï´Ù.
</para>
<section>
<title>Match-syntactic-class Operator (\sclass)</title>
<para>
ÀÌ ¿ÀÆÛ·¹ÀÌÅÍ´Â ¹®¹ý Ŭ·¡½º°¡, ¼¼úµÈ ¹®ÀÚ°¡ ¸í½ÃÇÏ´Â, ¾î¶² ¹®ÀÚ¸¦ ¸ÅĪ
ÇÕ´Ï´Ù. '\sclass'°¡ ÀÌ ¿ÀÆÛ·¹ÀÌÅ͸¦ ³ªÅ¸³»¸ç, class´Â ¿©·¯ºÐµéÀÌ ¿øÇÏ´Â ¹®¹ý
Ŭ·¡½º¸¦ ³ªÅ¸³»´Â ¹®ÀÚÀÔ´Ï´Ù. ¿¹¸¦ µé¿©, 'w' ´Â ´Ü¾î¸¦ ±¸¼ºÇÏ´Â ¹®ÀÚÀÇ ¹®¹ý
±Û·¡½º¸¦ ³ªÅ¸³»¹Ç·Î, '\sw'Àº ´Ü¾î¸¦ ±¸¼ºÇÏ´Â ¾Æ¹« ¹®ÀÚ¿Í ¸ÅĪÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>Match-not-syntactic-class Operator (\Sclass)</title>
<para>
À§ÀÇ ¿ÀÆÛ·¹ÀÌÅͿʹ ¹Ý´ëµÇ´Â ¶æÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, 'w' ´Â ´Ü¾î¸¦ ±¸¼ºÇÏ´Â
¹®ÀÚÀÇ ¹®¹ý Ŭ·¡½º¸¦ ³ªÅ¸³»¹Ç·Î, '\Sw' Àº ´Ü¾îÀÇ ±¸¼º¼ººÐÀÌ ¾Æ´Ñ ¾Æ¹«
¹®ÀÚ¿Í ¸ÅĪµË´Ï´Ù.
</para>
<para>
Áö°ã°Ô Áö±Ý±îÁö ¸¹À» °ÍÀ» ¼³¸íµå·ÈÁö¸¸, »ç½Ç ÀÌ ¸ðµç °ÍÀ» ´Ù ÇѲ¨¹ø¿¡
±â¾ïÇÏ½Ç Çʿ伺Àº ¾ø½À´Ï´Ù. ÀÚÁÖ »ç¿ëÇÏ½Ã¸é¼ ±×¶§±×¶§ ¸¶´Ù Á¶±Ý¾¿
Àͼ÷ÇÏ°Ô ÀÍÈ÷½Ã´Â °ÍÀÌ ÁÁÀ¸¸®¶ó º¾´Ï´Ù.
ÀÌÁ¦, Á¶±Ý ´õ Àç¹ÌÀÖ´Â Regex ÇÁ·Î±×·¡¹Ö¿¡ µé¾î°¡°Ú½À´Ï´Ù.
</para>
</section>
</section>
</section>
<section>
<title>Regex ÇÁ·Î±×·¡¹Ö</title>
<para>
Regex ´Â ¼¼°¡Áö ´Ù¸¥ ÀÎÅÍÆäÀ̽º°¡ ÀÖ½À´Ï´Ù. Çϳª´Â GNU¸¦ À§ÇØ µðÀÚÀÎ µÈ °Í°ú,
Çϳª´Â POSIX ¿¡ ȣȯµÇ´Â °Í, ³ª¸ÓÁö Çϳª´Â Berkeley UNIX ¿¡ ȣȯµÇ´Â
°ÍÀÔ´Ï´Ù. ´Ù¸¥ À¯´Ð½º ¹öÁ¯¿¡µµ ÃæºÐÈ÷ ȣȯµÇ´Â °ÍÀ¸·Î ÇÁ·Î±×·¡¹ÖÀ» ÇϽ÷Á¸é,
POSIX Regex ÇÔ¼ö·Î ÇÁ·Î±×·¡¹ÖÇϽô °ÍÀÌ ÁÁÀ» °Ì´Ï´Ù. ±×·¸Áö ¾Ê°í ÀϹÝÀûÀ¸·Î,
GNUÀÇ °·ÂÇÑ ±â´ÉÀ» »ç¿ëÇϽ÷Á¸é GNU Regex ÇÔ¼ö¸¦ »ç¿ëÇϽô °ÍÀÌ ÁÁÀ» °Í
ÀÔ´Ï´Ù. ±×·³, ¸ÕÀú ºñ±³Àû °£´ÜÇÑ BSD Regex ÇÔ¼öºÎÅÍ »ìÆìº¸°Ú½À´Ï´Ù.
</para>
<section>
<title>BSD Regex ÇÔ¼ö</title>
<para>
Berkeley UNIX ¿¡ ȣȯµÇ´Â Äڵ带 ÀÛ¼ºÇÏ·Á¸é, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϽʽÿä.
±×·¯³ª, ±×´ÙÁö ¸¹Àº ±â´ÉÀº Áö¿øµÇÁö ¾Ê°í, °£´ÜÇÑ µÎ°³ÀÇ ÇÔ¼ö¸¸ÀÌ Áö¿øµË´Ï´Ù.
µû¶ó¼, BSD Regex ÇÔ¼ö·Î´Â °£´ÜÇÑ °Ë»öÀº ÇÒ ¼ö ÀÖÀ¸³ª, ¸ÅĪÀÛ¾÷Àº ÇÒ ¼ö
¾ø½À´Ï´Ù.
BSD Regex ÇÔ¼ö·Î °Ë»öÀ» ÇϱâÀ§Çؼ´Â ´ÙÀ½ÀÇ ¼ø¼¸¦ µû¶ó¾ß ÇÕ´Ï´Ù.
<orderedlist>
<listitem>
<para>
re_syntax_options ÀÇ °ªÀ» ¿øÇÏ´Â Á¤±ÔÇ¥Çö½Ä ¹®¹ýºñÆ®ÀÇ °ªÀ¸·Î
¼³Á¤ÇÕ´Ï´Ù. ¾Õ¿¡¼ ¼³¸íÀÌ µÈ, °¢Á¾ÀÇ ¹®¹ý ºñÆ®¸¦ Á¶ÇÕÇÏ¿©
¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
<screen>
¿¹) re_syntax_options = RE_SYNTAX_POSIX_BASIC;
</screen>
</para>
</listitem>
<listitem>
<para>
Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏ ÇÕ´Ï´Ù.
<screen>
char *re_comp (char *regex)
</screen>
regex ´Â ³Î·Î ³¡³ª´Â Á¤±ÔÇ¥Çö½ÄÀÇ ÁÖ¼ÒÀÔ´Ï´Ù. re_comp ´Â ³»ºÎÀûÀ¸·Î
ÆÐÅϹöÆÛ¸¦ »ç¿ëÇϱ⠶§¹®¿¡ »ç¿ëÀÚ¿¡°Ô´Â ³ëÃâÀÌ µÇÁö ¾Ê±â ¶§¹®¿¡,
»õ·Î¿î Á¤±Ô Ç¥Çö½ÄÀ¸·Î °Ë»öÇÏ·Á¸é, ÇØ´ç Á¤±ÔÇ¥Çö½ÄÀ» Àç ÄÄÆÄÀÏÇÏ¿©¾ß ÇÕ´Ï´Ù.
Áï, ³»ºÎÀÇ ÆÐÅϹöÆÛ¸¦ ÇöÀçÀÇ Á¤±ÔÇ¥Çö½Ä°ú ¸ÂÃß¾î ÁÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
¸¸ÀÏ regex ¸¦ NULL½ºÆ®¸µ À¸·Î ÄÄÆÄÀÏ ÇÒ°æ¿ì¿¡´Â ³»ºÎÀÇ ÆÐÅϹöÆÛ°¡ º¯ÇÏÁö
¾ÊÀ¸´Ï ÁÖÀǸ¦ ÇÏ¿©¾ß ÇÕ´Ï´Ù.
</para>
<para>
re_comp ´Â ¼º°øÀûÀ¸·Î ÄÄÆÄÀϵǾú´Ù¸é, NULLÀ» µ¹·ÁÁÖ¸ç, Á¤±ÔÇ¥Çö½ÄÀÌ
À߸ø µÇ°Å³ª ¹®Á¦°¡ »ý°Ü¼ ÄÄÆÄÀÏ ÇÒ ¼ö ¾ø´Ù¸é ¿¡·¯ ¹®ÀÚ¿À» µ¹·ÁÁÝ´Ï´Ù.
ÀÌ ¿¡·¯ ¹®ÀÚ¿Àº µÚ¿¡ ³ª¿Ã re_compile_pattern ÀÇ ±×°Í°ú °°½À´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
°Ë»öÀÛ¾÷À» ÇÕ´Ï´Ù.
<screen>
int re_exec (char *string)
</screen>
Çѹø re_comp ·Î Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏ ÇÏ¿´´Ù¸é, ÀÌÁ¦ re_exec ¸¦ »ç¿ëÇÏ¿©
string ¹®ÀÚ¿³»¿¡¼ ÇØ´ç Ç¥ÇöÀÌ ³ª¿À´Â Áö¸¦ °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù.
re_exec ´Â °Ë»ö¿¡ ¼º°øÇßÀ» °æ¿ì¿¡ 1À» ¸®ÅÏÇϰí, ½ÇÆÐÇßÀ» °æ¿ì¿¡´Â 0À» ¸®ÅÏ
ÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö´Â ³»ºÎÀûÀ¸·Î ºü¸¥ °Ë»öÀ» À§ÇØ GNU fastmap À» »ç¿ëÇÕ´Ï´Ù.
</para>
</listitem>
</orderedlist>
ÀÚ, ±×·³ ÀÌÁ¦ °£´ÜÇÑ ¿¹Á¦¸¦ Çϳª ¸¸µé¾î º¸µµ·Ï ÇսôÙ. À§ÀÇ ÇÔ¼ö¸¦
»ç¿ëÇÏ¿© °£´ÜÇÑ ÆÐÅÏ °Ë»öÀ» Å×½ºÆ® ÇÏ´Â °ÍÀÔ´Ï´Ù.
<screen>
/* 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;
}
}
</screen>
¸ÕÀú, ÇöÀç ¿©·¯ºÐµéÀÌ Å×½ºÆ® ÇϽô µð·ºÅ丮¿¡ "regex.c" ¿Í "regex.h" ¸¦
ÇÑ ºÎ º¹»çÇØ µÎ½Ã°í, regex.c ¸¦ ÄÄÆÄÀϸ¸ ÇÏ¿© ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé°Å³ª À̹Ì
ÄÄÆÄÀÏµÈ regex.o ¸¦ ÇѺΠ°¡Áö°í ¿É´Ï´Ù. ÄÄÆÄÀÏ ÇÒ °æ¿ì,
<screen>
queen:~/regex$ gcc -c regex.c -g
</screen>
À§ÀÇ ¼Ò½º¸¦ bsd.c ·Î ÀúÀåÀ» ÇÑ´Ù¸é, ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏ ÇÏ¸é µË´Ï´Ù.
<screen>
queen:~/regex$ gcc -o bsd bsd.c regex.o
</screen>
´ÙÀ½Àº Å×½ºÆ® °á°úÀÔ´Ï´Ù.
<screen>
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$
</screen>
´ÙÀ½ Àå¿¡¼´Â POSIX Regex ÇÔ¼ö¸¦ »ìÆìº¸°Ú½À´Ï´Ù.
</para>
</section>
<section>
<title>POSIX Regex ÇÔ¼ö</title>
<para>
POSIX ¿Í ȣȯµÇ´Â Äڵ带 ÀÛ¼ºÇÏ·Á¸é ¿©±â¿¡ ³ª¿À´Â ÇÔ¼öµéÀ» »ç¿ëÇÒ ¼ö
ÀÖ½À´Ï´Ù.
</para>
<section>
<title>POSIX ÆÐÅÏ ¹öÆÛ</title>
<para>
POSIX ¿¡¼ Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏÇϰųª ¸ÅĪÀÛ¾÷À» ÇÏ·Á¸é, BSD ¿Í´Â ´Ù¸£°Ô
ÆÐÅÏ ¹öÆÛ¸¦ Á¦°øÇÏ¿©¾ß ÇÕ´Ï´Ù. regex_t ŸÀÔÀÎ POSIX ÆÐÅÏ ¹öÆÛ´Â,
re_pattern_buffer ŸÀÔÀÎ GNU ÆÐÅϹöÆÛ¿Í ±¸¼ºÀÌ µ¿ÀÏ ÇÕ´Ï´Ù.
"regex.h" ¿¡ º¸¸é ´ÙÀ½°ú °°ÀÌ ÇüÁ¤ÀǵǾî ÀÖ½À´Ï´Ù.
<screen>
typedef struct re_pattern_buffer regex_t;
</screen>
ÆÐÅÏ ¹öÆÛ¶õ ÀÌÀü¿¡µµ ¸»¾¸µå·ÈÁö¸¸, ÇØ´ç Á¤±ÔÇ¥Çö½Ä¿¡¼ ÆÐÅÏÀ»
¸ÅνÃ۱â À§ÇÑ ´Ù¾çÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Â ¹öÆÛÀÔ´Ï´Ù. À̰ÍÀº ¹°·Ð,
ÄÄÆÄÀÏÀ» ÇÔÀ¸·Î½á »ç¿ë°¡´ÉÇÏ°Ô µË´Ï´Ù.
±×·³, ¸ÕÀú GNU ÆÐÅÏ ¹öÆÛ¸¦ »ìÆìº¼±î¿ä?
</para>
<para>
¿©·¯ºÐµéÀº ¼·Î ´Ù¸¥ ¿©·¯Á¾·ùÀÇ ÆÐÅÏ ¹öÆÛ¸¦ µ¿½Ã¿¡ º¸À¯ÇÒ ¼ö ÀÖ½À´Ï´Ù.
"regex.h" ´Â ¾Æ·¡¿Í °°Àº ÆÐÅÏ ¹öÆÛ¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.
<screen>
/* ÄÄÆÄÀÏµÈ ÆÐÅÏÀ» °¡¸£Å°´Â Æ÷ÀÎÅÍ. À̰ÍÀÇ ¿ø¼Ò´Â ¹è¿ÀÇ À妽º·Î
»ç¿ëµÉ ¶§°¡ Àֱ⠶§¹®¿¡ '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;
</screen>
»ç½Ç, ÀÌ °¡¿îµ¥¿¡¼ ÀÚÁÖ »ç¿ëÇÏ´Â °ÍÀº ¸î°³ Á¤µµ¿¡ Áö³ªÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù.
</para>
</section>
<section id="posixreg">
<title>POSIX Á¤±ÔÇ¥Çö½Ä ÄÄÆÄÀÏ</title>
<para>
ÆÐÅÏ ¹öÆÛ¸¦ ÄÄÆÄÀÏÇÏ·Á¸é 'regcomp' ¸¦ »ç¿ëÇÕ´Ï´Ù.
<screen>
int regcomp (regex_t *preg, const char *regex, int cflags)
</screen>
'preg' ´Â ÃʱâÈÇÒ ÆÐÅÏ ¹öÆÛÀÇ ÁÖ¼ÒÀÔ´Ï´Ù. 'regex' ´Â Á¤±ÔÇ¥Çö½ÄÀÇ
ÁÖ¼ÒÀÔ´Ï´Ù. ±×¸®°í cflags ´Â Á¶ÇÕ°¡´ÉÇÑ ÄÄÆÄÀÏ Ç÷¡±×ÀÔ´Ï´Ù. À¯È¿ÇÑ
ºñÆ®´Â ´ÙÀ½°ú °°½À´Ï´Ù.
<variablelist>
<varlistentry>
<term>REG_EXTENDED</term>
<listitem>
<para>
POSIX È®Àå Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇϰڴٴ °ÍÀ» ÀǹÌÇÕ´Ï´Ù. À̰ÍÀÌ
¼¼Æ®µÇ¾îÀÖÁö ¾Ê´Ù¸é POSIX ±âº» Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇϰڴٴ °ÍÀ»
ÀǹÌÇÕ´Ï´Ù. regcomp ´Â 'preg'ÀÇ syntax Çʵ带 ±×¿¡ ¾Ë¸Â°Ô ¼³Á¤ÇÕ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_ICASE</term>
<listitem>
<para>
´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. regcomp ´Â 'preg' ÀÇ
'translate' Çʵ带 ´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÏ´Â º¯È¯µ¥À̺í·Î ¼³Á¤ÇÕ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_NOSUB</term>
<listitem>
<para>
'preg' ÀÇ 'no_sub' Çʵ带 ¼¼Æ®Ç϶ó´Â ÀǹÌÀÔ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_NEWLINE</term>
<listitem>
<para>
match-any-character operator ('.')´Â newline À» ¸ÅĪÇÏÁö ¸øÇÕ´Ï´Ù.
nonmatching list ('[^...]')´Â newline À» Æ÷ÇÔÇÏÁö ¸øÇÕ´Ï´Ù.
match-beginning-of-line ('^') ´Â REG_NOTBOL ÀÌ ¾î¶»°Ô ¼³Á¤µÇ¾î
Àִ°¡¿¡ °³ÀÇÄ¡ ¾Ê°í newline ¹Ù·Î µÚÀÇ ºó¹®Àð¿À» ¸ÅĪÇÕ´Ï´Ù.
match-end-of-line operator ('$') ´Â REG_NOTEOL ÀÌ ¾î¶»°Ô ¼³Á¤µÇ¾î
Àִ°¡¿¡ °³ÀÇÄ¡ ¾Ê°í newline ¹Ù·Î ÀÌÀü¿¡ ¿À´Â ºó¹®ÀÚ¿À» ¸ÅĪÇÕ´Ï´Ù.
</para>
</listitem>
</varlistentry>
</variablelist>
regcomp °¡ ¼º°øÀûÀ¸·Î Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏÇÏ°Ô µÇ¸é, 0À» ¸®ÅÏÇϰí,
'*pattern_buffer' ¸¦ ÄÄÆÄÀÏµÈ ÆÐÅÏÀ¸·Î ¼³Á¤ÇÕ´Ï´Ù. syntax ¸¦ Á¦¿ÜÇϰí´Â,
ÀÌÈÄ¿¡ »ìÆìº¼ GNU ÄÄÆÄÀÏ ÇÔ¼ö¿Í °°Àº ¹æ¹ýÀ¸·Î °°Àº Çʵ带 ¼³Á¤ÇÕ´Ï´Ù.
</para>
<para>
regcomp °¡ ÄÄÆÄÀÏ¿¡ ½ÇÆÐÇÏ°Ô µÇ¸é, ¾Æ·¡ÀÇ ¿¡·¯ÄÚµå Áß Çϳª¸¦ ¹ÝȯÇÕ´Ï´Ù.
<variablelist>
<varlistentry>
<term>REG_BADRPT</term>
<listitem>
<para>
¿¹¸¦ µé¸é, 'a**' ¾ÈÀÇ ¿¬¼ÓÀûÀÎ ¹Ýº¹ ¿¬»êÀÚ '**' ÀÇ °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_BADBR</term>
<listitem>
<para>
¿¹¸¦ µé¸é, 'a\{-1' ¿¡¼ÀÇ count '-1' °°Àº °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_EBRAC</term>
<listitem>
<para>
¿¹¸¦ µé¸é, 'a\{1' °ú °°ÀÌ '}' °¡ ºüÁø °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_EBRACK</term>
<listitem>
<para>
¿¹¸¦ µé¸é, '[a' ¿Í °°ÀÌ ']' °¡ ºüÁø °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_ERANGE</term>
<listitem>
<para>
¿¹¸¦ µé¸é, '[z-a]' ³ª '[[:alpha:]-|]' °ú °°ÀÌ À߸øµÈ °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_ECTYPE</term>
<listitem>
<para>
¿¹¸¦ µé¸é, '[[:foo:]' ¿Í °°ÀÌ À߸øµÈ Ŭ·¡½º ¸íĪÀÎ °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_EPAREN</term>
<listitem>
<para>
¿¹¸¦ µé¸é, 'a\)' ¿Í °°ÀÌ '(' ¸¦ ºü¶ß·ÈÀ» °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_ESUBREG</term>
<listitem>
<para>
¿¹¸¦ µé¸é, '\(a\)\2' ¿Í °°ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â ±×·ìÀ» ÂüÁ¶ÇÏ´Â °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_EESCAPE</term>
<listitem>
<para>
¿¹¸¦ µé¸é, 'a\' ¿¡¼¿Í °°ÀÌ '\' °¡ À߸ø »ç¿ëµÇ¾úÀ» °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_BADPAT</term>
<listitem>
<para>
¿¹¸¦ µé¸é, È®Àå Á¤±ÔÇ¥Çö½Ä ¹®¹ý¿¡¼ 'a()b' ¿¡¼ÀÇ ºó±×·ì
'()' ÀÌ ³ª¿Ã °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_ESIZE</term>
<listitem>
<para>
Á¤±ÔÇ¥Çö½ÄÀÌ ÆÐÅÏ ¹öÆÛÀÇ Å©±â·Î 65536 º¸´Ù Å« ¹ÙÀÌÆ®¸¦ ÇÊ¿ä·Î ÇÒ °æ¿ì
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>REG_ESPACE</term>
<listitem>
<para>
Á¤±ÔÇ¥Çö½ÄÀÌ Regex °¡ ½ÇÇàÇÏ´Â µ¥¿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦ ¸ðÀÚ¶ó°Ô ÇÒ °æ¿ì
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</section>
<section>
<title>POSIX ¸ÅĪ</title>
<para>
Çѹø, ÆÐÅÏÀ» ÆÐÅϹöÆÛ·Î ÄÄÆÄÀÏÀ» Çß´Ù¸é, ÀÌÁ¦ ¸ÅĪÀÛ¾÷À» ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ ¸ÅĪÀÛ¾÷À» 'regexec' °¡ ¼öÇàÀ» ÇÕ´Ï´Ù.
<screen>
int regexec (const regex_t *preg, const char *string,
size_t nmatch, regmatch_t pmatch[], int eflags)
</screen>
'preg' ´Â ÆÐÅÏÀ» ÄÄÆÄÀÏÇÑ ÆÐÅÏ ¹öÆÛÀÇ ÁÖ¼ÒÀ̰í, 'string' Àº ¸ÅĪÀ»
Çϱ⸦ ¿øÇÏ´Â ¹®ÀÚ¿ÀÔ´Ï´Ù. 'pmatch' ¿¡ ´ëÇØ¼´Â µÚ¿¡¼ ÀÚ¼¼ÇϰÔ
¼³¸íÀÌ µË´Ï´Ù. 'nmatch' ¸¦ 0À¸·Î ¼³Á¤Çϰųª, 'preg' ¸¦ ÄÄÆÄÀÏ
¿É¼Ç REG_NOSUB ·Î ¼¼ÆÃÇÏ¿´´Ù¸é 'regexec' ´Â 'pmatch' ¸¦ ¹«½ÃÇÒ °ÍÀÔ´Ï´Ù.
±×·¸Áö ¾ÊÀ¸¸é, ¿©·¯ºÐµéÀº Àû¾îµµ 'nmatch' ¿ø¼Òµé ¸¸Å ÇÒ´çÇØ¾ß ÇÕ´Ï´Ù.
regexec ´Â 'nmatch' ¹ÙÀÌÆ® ¿É¼ÂÀ» 'pmatch' ¿¡ ±â·ÏÀ» ÇÒ°ÍÀ̸ç,
»ç¿ëµÇÁö ¾Ê´Â ¿ø¼Ò¸¦ -1ºÎÅÍ 'pmatch[nmatch]-1' ±îÁö ¼³Á¤ÇÒ °ÍÀÔ´Ï´Ù.
</para>
<para>
'eflags' ´Â ½ÇÇà Ç÷¡±×¸¦ ¼³Á¤Çϸç, REG_NOTBOL °ú REG_NOTEOL ÀÌ µÉ ¼ö
ÀÖ½À´Ï´Ù. REG_NOTBOL À» ¼³Á¤ÇÑ´Ù¸é, match-beginning-of-line operator ('^')´Â
Ç×»ó ¸ÅĪ¿¡ ½ÇÆÐ¸¦ ÇÕ´Ï´Ù. REG_NOTEOL Àº match-end-of-line operator ¿¡
ÀÖ¾î¼ À§¿Í À¯»çÇÏ°Ô ÀÛµ¿ÇÕ´Ï´Ù.
</para>
<para>
regexec ´Â ÄÄÆÄÀÏµÈ ÆÐÅÏÀÌ 'string' °ú ¸ÅĪÀÌ µÇ¾ú´Ù¸é 0À», ±×·¸Áö ¾Ê´Ù¸é,
REG_NOMATCH ¸¦ ¸®ÅÏÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>¿¡·¯ ¸Þ½ÃÁö Ãâ·ÂÇϱâ</title>
<para>
regcomp ³ª regexec °¡ ½ÇÆÐÇÏ°Ô µÇ¸é, 0ÀÌ ¾Æ´Ñ ¿¡·¯Äڵ带 ¹ÝȯÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ ¿¡·¯ÄÚµåµéÀº À§ÀÇ 6.2.2 ¿Í 6.2.3 ¿¡¼ ¼³¸íÇÑ °ÍµéÀÔ´Ï´Ù.
¿¡·¯Äڵ忡 ÇØ´çÇÏ´Â ¿¡·¯ ¹®ÀÚ¿À» ¾òÀ¸·Á¸é 'regerror'¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
<screen>
size_t regerror (int errcode,
const regex_t *preg,
char *errbuf,
size_t errbuf_size)
</screen>
'errcode' ´Â ¿¡·¯ÄÚµåÀ̰í, 'preg' ´Â ¿¡·¯°¡ ¹ß»ýÇÑ ÆÐÅϹöÆÛÀ̸ç,
'errbuf' ´Â ¿¡·¯ ¹öÆÛÀ̸ç, 'errbuf_size' ´Â 'errbuf' ÀÇ Å©±âÀÔ´Ï´Ù.
</para>
<para>
regerror ´Â 'errcode' ¿¡ ´ëÀÀÇÏ´Â ¿¡·¯ ¹®ÀÚ¿ÀÇ ¹ÙÀÌÆ® Å©±â(³Î¹®ÀÚ±îÁö Æ÷ÇÔ)
¸¦ ¹ÝȯÇÕ´Ï´Ù. 'errbuf' ¿Í 'errbuf_size' °¡ 0ÀÌ ¾Æ´Ï¶ó¸é, 'errbuf' ¿¡ óÀ½
errbuf_size-1 ¹®ÀÚÀÇ ¿¡·¯ ¹®ÀÚ¿À» ³Î¹®ÀÚ¸¦ Ãß°¡Çؼ µ¹·ÁÁÝ´Ï´Ù.
'errbuf_size' ´Â 'errbuf' ÀÇ ¹ÙÀÌÆ® Å©±âº¸´Ù À۰ųª °°Àº ¾ç¼öÀ̾î¾ß ÇÕ´Ï´Ù.
¿©·¯ºÐµéÀº, 'regerror' ÀÇ ¿¡·¯ ¹®ÀÚ¿À» ´ã¾Æ³»´Â µ¥ ¾ó¸¶¸¸Å Å©±âÀÇ'errbuf'
°¡ ÇÊ¿äÇÑÁö ¾Ë¾Æº¸±â À§Çؼ 'errbuf' ¸¦ NULL·Î, 'errbuf_size' ¸¦ 0À¸·Î ÇØ¼
È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
</section>
<section>
<title>¹ÙÀÌÆ® ¿É¼Â »ç¿ëÇϱâ</title>
<para>
POSIX ¿¡¼, regmatch_t Çü º¯¼ö´Â GNU ÀÇ ·¹Áö½ºÅÍ¿Í ºñ½ÁÇÏÁö¸¸, ¶È°°Áö´Â
¾Ê½À´Ï´Ù. POSIX ¿¡¼ ·¹Áö½ºÅÍÀÇ Á¤º¸¸¦ ¾òÀ¸·Á¸é regexec ¿¡, regmatch Çü
º¯¼öÀÎ, 0ÀÌ ¾Æ´Ñ 'pmatch'¸¦ ³Ñ°ÜÁÙ ¼ö ÀÖ½À´Ï´Ù. regmatch_t Çü ±¸Á¶Ã¼´Â
´ÙÀ½°ú °°½À´Ï´Ù.
<screen>
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
</screen>
¸ÅĪ ÇÔ¼ö°¡ Á¤º¸¸¦¾î¶»°Ô ·¹Áö½ºÅÍ¿¡ ÀúÀåÇÏ´Â Áö´Â µÞºÎºÐ¿¡¼ ¼³¸íÇϰڽÀ´Ï´Ù.
</para>
<para>
GNU Regex ÀÇ 'regs' ¿Í POSIX ÀÇ 'regs' ´Â À¯»çÇÏ°Ô ´ëÀÀÇÕ´Ï´Ù.
'reg' ÀÇ 'pmatch', pmatch[i]->rm_so ´Â regs->start[i] ¿Í ´ëÀÀÇϰí
pmatch[i]->rm_eo ´Â regs->end[i] ¿Í ´ëÀÀÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>POSIX ÆÐÅÏ ¹öÆÛ¸¦ Free Çϱâ</title>
<para>
ÆÐÅÏ ¹öÆÛ¿¡ ÇÒ´çµÈ °ÍÀ» free ÇÏ´Â ÇÔ¼ö´Â 'regfree' ÀÔ´Ï´Ù.
<screen>
void regfree (regex_t *preg)
</screen>
'preg' ´Â free ÇÒ, ÇÒ´çµÈ ÆÐÅϹöÆÛÀÔ´Ï´Ù. regfree ´Â ¶ÇÇÑ 'preg'ÀÇ
'allocated' ¿Í 'used' Çʵ带 0À¸·Î ¼³Á¤ÇÕ´Ï´Ù. ÆÐÅÏ ¹öÆÛ¸¦ free ÇÑ
ÀÌÈÄ¿¡´Â, ¸ÅĪ ÀÛ¾÷À» ¼öÇàÇϱâ Àü¿¡ Á¤±ÔÇ¥Çö½ÄÀ» ÇØ´ç ÆÐÅÏ ¹öÆÛ¿¡
´Ù½Ã ÄÄÆÄÀÏÇØ¾ß ÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>POSIX Regex·Î egrep ¸¸µé±â</title>
<para>
grep Àº ±âº» Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇϰí, egrep Àº È®Àå Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇϴµ¥,
¿©±â¼´Â egrep ÀÇ ±â´ÉÀ» °£´ÜÇÏ°Ô ±¸ÇöÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
Áö±Ý±îÁö ¼³¸íÇÑ ±â´É¸¸À¸·Îµµ egrep ÀÇ ±âº»ÀûÀÎ ±â´ÉÀº ½±°Ô ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
grep ·ùÀÇ ±âº»ÀûÀÎ ±â´ÉÀº '¸ÅĪ' ÀÌ ¾Æ´Ï¶ó '°Ë»ö'À̱⠶§¹®ÀÔ´Ï´Ù.
</para>
<para>
¿ì¸®°¡ ¸¸µé'egrep' À» 'my_egrep' À̶ó°í ºÎ¸¥´Ù¸é, 'my_egrep' ÀÇ ±âº»ÀûÀÎ
ÀÛµ¿Àº ´ÙÀ½°ú °°ÀÌ Çϵµ·Ï ÇսôÙ.
<orderedlist>
<listitem>
<para>
Ưº°ÇÑ ¿É¼ÇÀº Áö¿øÇÏÁö ¾Ê°í, ÀÎÀÚ´Â ¸ðµÎ ÆÐÅÏÀ̳ª ÆÄÀϸíÀ¸·Î ó¸®ÇÑ´Ù.
</para>
</listitem>
<listitem>
<para>
ÀÔ·ÂÆÄÀϸíÀÌ ¸í½ÃµÇÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â Ç¥ÁØÀԷ¿¡¼ ¹Þ´Â´Ù.
</para>
</listitem>
<listitem>
<para>
ÄÄÆÄÀÏ Ç÷¡±×´Â 'REG_EXTENDED' ¸¦ »ç¿ëÇÏ¿© È®ÀåÁ¤±ÔÇ¥Çö½ÄÀ» Áö¿øÇÑ´Ù.
</para>
</listitem>
</orderedlist>
Ãß°¡ÀûÀÎ ¿É¼ÇÀ» Áö¿øÇÏ´Â °ÍÀº ¼Ò½º¸¦ Á¶±Ý¾¿ °íÄ¡¸é¼ ½ÃµµÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù.
<screen>
/* 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);
}
</screen>
´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÏ°Ô ¸¸µé·Á¸é, Á¤±ÔÇ¥Çö½ÄÀÇ ÄÄÆÄÀϽÿ¡, regcomp ÀÇ
REG_EXTENDED ¿¡ REG_ICASE ¸¦ Ãß°¡ÇÏ½Ã¸é µË´Ï´Ù (grep ·ùÀÇ '-i' ¿É¼Ç).
grep ·ùÀÇ '-v' ³ª -n' ¿É¼ÇÀ» Áö¿øÇÏ´Â °ÍÀº ÀÌÁ¦ °£´ÜÇÏ°Ô ÇØ°áµÉ °ÍÀÔ´Ï´Ù.
´ÙÀ½Àº Å×½ºÆ® ÇÑ °á°úÀÔ´Ï´Ù.
<screen>
$ 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 ¸¸µé±â
</screen>
</para>
</section>
</section>
<section>
<title>GNU Regex ÇÔ¼ö</title>
<para>
Ưº°È÷ POSIX ³ª ¹öŬ¸® UNIX ¿¡ ȣȯ¼ºÀ» »ý°¢ÇÏÁö ¾Ê¾Æµµ µÈ´Ù¸é, GNU regex
ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¿©·¯¸ð·Î ÁÁÀ» Áö ¸ð¸£°Ú½À´Ï´Ù.
GNU regex ÇÔ¼öµµ ÀÌÀü¿¡ ¼³¸íµå¸° POSIX ³ª BSD regex ÇÔ¼öÀÇ ±â´ÉÀ»
Æ÷ÇÔÇÏ°í ³ª¸ÓÁö ¿©·¯°³ÀÇ º¹ÀâÇÑ ±â´ÉÀ» Ãß°¡ÇÑ °ÍÀÔ´Ï´Ù.
±×·³, Çϳª¾¿ ¾Ë¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù.
</para>
<section>
<title>GNU ÆÐÅÏ ¹öÆÛ</title>
<para>
GNU regex ´Â GNU ÆÐÅÏ ¹öÆÛ¸¦ ÀÌ¿ëÇÏ¿© ÄÄÆÄÀÏµÈ Á¤±ÔÇ¥Çö½ÄÀ»
Ȱ¿ëÇÕ´Ï´Ù.
ÀÌ ÆÐÅÏ ¹öÆÛ´Â POSIX regex ¿¡¼ ¼³¸íÇÏ¿´À¸¹Ç·Î °Ç³Ê¶Ù°Ú½À´Ï´Ù.
</para>
</section>
<section>
<title>GNU Á¤±ÔÇ¥Çö½Ä ÄÄÆÄÀÏ</title>
<para>
GNU regex ¿¡¼´Â Á¤±ÔÇ¥Çö½ÄÀ» °Ë»öÇÏ°í ¸ÅĪÇÏ´Â °ÍÀ» µÑ´Ù ÇÒ ¼ö ÀÖ½À´Ï´Ù.
GNU regex ¿¡¼µµ POSIX ³ª BSD regex ó·³, ¸ÕÀú Á¤±ÔÇ¥Çö½ÄÀ»
ÄÄÆÄÀÏÇÏ¿©, ÆÐÅϹöÆÛ¿¡ ¸¶·ÃÇØ µÎ¾î¾ß ÇÕ´Ï´Ù. ÀÌÀü°ú ¸¶Âù°¡Áö·Î
ÆÐÅϹöÆÛ´Â ¾î¶² ¹®¹ýÀ¸·Î ÄÄÆÄ ÀϵǴÀ³Ä¿¡ µû¶ó ¸ÅĪÀ̳ª °Ë»öÀÇ °á°ú°¡
´Þ¶óÁö°Ô ¸¶·ÃÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¹®¹ýÀ» ÁöÁ¤ÇÏ´Â º¯¼ö´Â re_syntax_options
ÀÔ´Ï´Ù. µû¶ó¼ ÄÄÆÄÀÏÀ» ÇϱâÀü¿¡ Á¤È®ÇÑ ¹®¹ýÀ» ¼¼ÆÃÇØ µÎ´Â °ÍÀÌ
Áß¿äÇÕ´Ï´Ù.
</para>
<para>
GNU regex ¿¡¼ ÆÐÅÏÀ» ÄÄÆÄÀÏÇÏ´Â °ÍÀº, re_compile_pattern ÀÔ´Ï´Ù.
re_compile_pattern Àº ÆÐÅϹöÆÛ¸¦ ÀÎÀÚ·Î ÃëÇÏ´Â µ¥, ÆÐÅÏ ¹öÆÛÀÇ ´ÙÀ½ÀÇ
Çʵå´Â Ãʱâȸ¦ ½ÃÄÑÁÖ¾î¾ß ÇÕ´Ï´Ù.
<variablelist>
<varlistentry>
<term>translate initialization</term>
<listitem>
<para>
¸ÅĪÀ̳ª °Ë»öÀÌÀü¿¡ Àû¿ëµÇ´Â º¯È¯Å×À̺íÀ» »ç¿ëÇÑ´Ù¸é ±×
º¯È¯Å×ÀÌºí¿¡ ´ëÇÑ Æ÷ÀÎÅÍ·Î ÃʱâÈ ½ÃŰÁÝ´Ï´Ù. º¯È¯Å×À̺íÀÌ ¾ø´Ù¸é
NULL·Î ÃÊ ±âÈ ½ÃÄÑÁÖ¸é µË´Ï´Ù. translate ´Â GNU ÆÐÅϹöÆÛ¿¡¼
char * Çü ÇʵåÀÓÀ» »ó±âÇϼ¼¿ä. º¯È¯ Å×ÀÌºí¿¡ ´ëÇÑ À̾߱â´Â
µÞÂÊ¿¡¼ ¼³¸íÇϰڽÀ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>fstmap</term>
<listitem>
<para>
fastmap (re_search ·Î ºü¸¥ °Ë»ö¿¡ »ç¿ëµÊ) À» »ç¿ëÇÏ·Á¸é ±× Æ÷ÀÎÅ͸¦
ÁöÁ¤ÇÏ¸é µÇ¸ç, ÇÊ¿ä¾ø´Ù¸é NULL·Î ÁöÁ¤ÇÏ¸é µË´Ï´Ù.
ÀÌ ¶ÇÇÑ char * Çʵå ÀÔ´Ï´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>buffer allocated</term>
<listitem>
<para>
re_compile_pattern À¸·Î ÄÄÆÄÀÏµÈ ÆÐÅÏ¿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦
ÇÒ´çÇϰíÀÚ ÇÒ °æ¿ì¿¡´Â µÑ´Ù 0À̳ª NULL·Î ÃʱâÈ ÇÏ¸é µË´Ï´Ù.
(buffer unsigned char *, allocated ´Â unsignedlong ÇüÀÔ´Ï´Ù.
0À̳ª NULLÀ̳ª °á±¹¿¡´Â 0ÀÔ´Ï´Ù.) ¿©·¯ºÐµéÀÌ ÀÌ¹Ì ÇÒ´çÇÑ ¸Þ¸ð¸®
ºí·ÏÀ» Regex ¿¡ »ç¿ëÇÏ·Á¸é, buffer ´Â ±×°ÍÀÇ ÁÖ¼Ò·Î, allocated ´Â
ºí·ÏÀÇ ¹ÙÀÌÆ®Å©±â·Î ¼³Á¤ÇÏ¸é µË´Ï´Ù.
re_compile_pattern Àº ÄÄÆÄÀÏµÈ ÆÐÅÏ¿¡ ÇÊ¿äÇÏ´Ù¸é ¸Þ¸ð¸®¸¦ È®ÀåÇϱâ
À§Çؼ realloc ¸¦ »ç¿ëÇÕ´Ï´Ù.
</para>
</listitem>
</varlistentry>
</variablelist>
ÆÐÅÏÀ» ÄÄÆÄÀÏ ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¸é µË´Ï´Ù.
<screen>
char *re_compile_pattern (const char *regex, const int regex_size,
struct re_pattern_buffer *pattern_buffer)
</screen>
'regex' ´Â Á¤±ÔÇ¥Çö½Ä ¹®ÀÚ¿ÀÇ ÁÖ¼ÒÀ̰í, 'regex_size' ´Â ±×°ÍÀÇ
±æÀÌÀÔ´Ï´Ù. pattern_buffer ´Â ÆÐÅϹöÆÛÀÇ ÁÖ¼ÒÀÔ´Ï´Ù.
</para>
<para>
re_compile_pattern ÀÌ ¼º°øÀûÀ¸·Î ÇØ´ç Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏÇÏ¿´´Ù¸é
0(NULL)À» ¸®ÅÏÇϰí, *pattern_buffer ¸¦ ÄÄÆÄÀÏµÈ ÆÐÅÏÀ¸·Î ¼³Á¤À» ÇÕ´Ï´Ù.
¾Æ¿ï·¯ ¾Æ·¡ÀÇ ÆÐÅϹöÆÛ ³»ÀÇ Çʵ带 ¼¼ÆÃÇÕ´Ï´Ù.
</para>
<para>
<table>
<title>ÆÐÅϹöÆÛ ³»ÀÇ ÇÊµå ¼³Á¤</title>
<tgroup cols=2>
<tbody>
<row>
<entry>buffer</entry>
<entry>ÄÄÆÄÀÏµÈ ÆÐÅÏ</entry>
</row>
<row>
<entry>used</entry>
<entry>buffer°¡ °¡¸£Å°´Â °÷¿¡¼ »ç¿ëÁßÀÎ ¹ÙÀÌÆ®</entry>
</row>
<row>
<entry>syntax</entry>
<entry>re_syntax_optionsÀÇ ÇöÀç°ª</entry>
</row>
<row>
<entry>rensub</entry>
<entry>regex ¿¡¼ÀÇ º¸Á¶Ç¥Çö½ÄÀÇ °¹¼ö</entry>
</row>
</tbody>
</tgroup>
</table>
re_compile_pattern ÀÌ 'regex' ¸¦ ÄÄÆÄÀÏ ÇÒ ¼ö ¾ø´Ù¸é,
<xref linkend="posixreg"> ¿¡¼ ¼³¸íÇÑ ¿¡·¯ ¹®ÀÚ¿À» µ¹·ÁÁÝ´Ï´Ù.
</para>
</section>
<section>
<title>GNU ¸ÅĪ</title>
<para>
GNU ¸ÅĪÀº ¹®ÀÚ¿¼Ó¿¡¼ °¡´ÉÇÑÇÑ ½ÃÀÛÀ§Ä¡¿¡¼ ¸í½ÃµÈµ¥·Î ¸ÅĪÀ» ½Ãŵ´Ï´Ù.
Çѹø ÆÐÅÏÀ» ÆÐÅϹöÆÛ·Î ÄÄÆÄÀÏÀ» Çß´Ù¸é, ¹®ÀÚ¿¿¡¼ ÆÐÅÏÀ» ¸ÅĪ
½Ãų¼ö ÀÖ½À´Ï´Ù.
<screen>
int re_match (struct re_pattern_buffer *pattern_buffer,
const char *string, const int size,
const int start, struct re_registers *regs)
</screen>
</para>
<para>
pattern_buffer Àº ÄÄÆÄÀÏµÈ ÆÐÅϹöÆÛÀÇ ÁÖ¼ÒÀ̰í, string Àº ¸ÅĪÀ»
ÇϰíÀÚ ÇÏ´Â ¹®ÀÚ¿ÀÔ´Ï´Ù. ÀÌ ¹®ÀÚ¿¿¡´Â NULL À̳ª newline À» Æ÷ÇÔÇÒ ¼ö
ÀÖ½À´Ï´Ù. size ´Â ±× ¹®ÀÚ¿ÀÇ ±æÀÌÀ̸ç, start ´Â ¸ÅĪÇϱ⸦ ¿øÇÏ´Â
¹®ÀÚ¿¼ÓÀÇ À妽º(¹®ÀÚ¿ ù ¹®ÀÚÀÇ À妽º´Â 0)ÀÔ´Ï´Ù.
</para>
<para>
re_match ´Â pattern_buffer ÀÇ syntax ÇʵåÀÇ ¹®¹ý¿¡ µû¶ó, ¹®ÀÚ¿ string À»,
pattern_bufferÀÇ Á¤±Ô Ç¥Çö½Ä°ú ¸ÅĪÀ» ½ÃŰ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. ¹®ÀÚ¿°ú
¸ÅĪÇÒ ¼ö ¾ø´Ù¸é -1À» ¸®ÅÏÇϰí, ³»ºÎÀûÀÎ ¿¡·¯ÀÏ °æ¿ì¿¡´Â -2¸¦,
¼º°øÀûÀÏ °æ¿ì¿¡´Â ¹®ÀÚ¿°ú ¸ÅĪµÈ Ƚ¼ö¸¦ µ¹·ÁÁÝ´Ï´Ù.
</para>
<para>
¿¹¸¦ µé¸é, pattern_buffer ÀÌ 'a*'¸¦ ÄÄÆÄÀÏÇÑ ÆÐÅϹöÆÛ¶ó°í Çϰí, string ÀÌ
'aaaaab'À̸ç, µû¶ó¼ size´Â 6ÀÌ µÇ°í, start ´Â 2¶ó°í °¡Á¤ÇÑ´Ù¸é,
re_match´Â 3À» ¸®ÅÏÇÕ´Ï´Ù. 'a*' ´Â ¹®ÀÚ¿¿¡¼ ¸¶Áö¸· ¼¼°³ÀÇ 'a'¸¦
¸ÅνÃų °ÍÀÔ´Ï´Ù. start °¡ 0À̶ó°í ÇÑ´Ù¸é, re_match ´Â 5¸¦ ¸®ÅÏÇÕ´Ï´Ù.
start °¡ 5³ª 6ÀÏ °æ¿ì¿¡´Â 0À» ¹ÝȯÇÕ´Ï´Ù.
start °¡ 0¿¡¼ size »çÀ̰¡ ¾Æ´Ï¶ó¸é, re_match ´Â -1À» ¹ÝȯÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>GNU °Ë»ö</title>
<para>
°Ë»öÇÏ´Â µ¥ »ç¿ëµÇ´Â ÇÔ¼ö´Â re_search ÀÔ´Ï´Ù.
re_search ¸¦ »ç¿ëÇϱâ Àü¿¡ Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏ ÇÏ¼Å¾ß °ÚÁÒ?
re_search ÀÇ Á¤ÀÇ´Â ´ÙÀ½°ú °°½À´Ï´Ù.
<screen>
int re_search (struct re_pattern_buffer *pattern_buffer,
const char *string, const int size,
const int start, const int range,
struct re_registers *regs)
</screen>
ÀÌ ÀÎÀÚµéÀº re_match ¿Í À¯»çÇÕ´Ï´Ù. ¿©±â¼ start ¿Í range ´Â re_matchÀÇ
start ¸¦ ´ëÀÀÇÕ´Ï´Ù.
</para>
<para>
range °¡ ¾ç¼öÀ̸é, re_search ´Â À妽º start ¿¡¼ ÃÖÃÊÀÇ ¸ÅĪÀ» ½ÃÀÛÇϸç
½ÇÆÐÇÒ °æ¿ì start+1 ¿¡¼ °Ë»öÀ» ÇÏ¸ç °è¼Ó Çϳª¾¿ ³ª¾Æ°¡¼ start+range
±îÁö ¼öÇàÇÕ´Ï´Ù. range °¡ À½¼ö¶ó¸é, À妽º start ¿¡¼ ù ¸ÅĪÀ»
¼öÇàÇϸç, ÀÌÈÄ¿¡ -1¾¿ À§Ä¡¸¦ ¹Ý´ë·Î ¿Å°Ü¼ ¼öÇàÇÕ´Ï´Ù.
</para>
<para>
start °¡ 0¿¡¼ size »çÀ̰¡ ¾Æ´Ï¶ó¸é, re_search ´Â -1À» µ¹·ÁÁÝ´Ï´Ù.
range °¡ ¾ç¼öÀÏ °æ¿ì¿¡´Â re_search ´Â, ÇÊ¿äÇÏ´Ù¸é range ¸¦ Á¶ÀýÇØ¼
start+range-1 ÀÌ 0¿¡¼ size »çÀ̰¡ µÇµµ·Ï ÇÏ¿© °Ë»öÀÌ ¹®ÀÚ¿ ¹Ù±ùÀ¸·Î
³ª°¡Áö ¸øÇϵµ·Ï ÇÕ´Ï´Ù. À¯»çÇϰÔ, range °¡ À½¼ö¶ó¸é, re_search ´Â
¹üÀ§¸¦ start+range+1 ÀÌ 0¿¡¼ size »çÀ̰¡ µÇµµ·Ï ÇÊ¿äÇÒ °æ¿ì Á¶ÀýÇϰÔ
µË´Ï´Ù.
</para>
<para>
ÆÐÅϹöÆÛÀÇ fastmap Çʵ尡 NULL À̶ó¸é, re_search ´Â ¿¬¼ÓÀûÀÎ À§Ä¡·Î
¸ÅĪÀ» ½ÃÀÛÇϸç, NULL ÀÌ ¾Æ´Ï¶ó¸é, fastmap À» »ç¿ëÇÏ¿© Á» ´õ
È¿À²ÀûÀ¸·Î °Ë»öÀ» ¼öÇàÇÕ´Ï´Ù.
¸ÅĪÀÌ Çѹøµµ µÇÁö ¾Ê´Â´Ù¸é, re_search ´Â -1À» ¹ÝȯÇϰí, ¸ÅĪÀÌ
µÈ´Ù¸é ¸ÅĪÀÌ ½ÃÀÛµÈ À§Ä¡ÀÇ À妽º¸¦ µ¹·ÁÁÖ¸ç, ³»ºÎ¿¡·¯ÀÏ
°æ¿ì¿¡´Â -2¸¦ µ¹·ÁÁÝ´Ï´Ù.
</para>
</section>
<section>
<title>ºÐ¸®µÈ µ¥ÀÌÅÍ·Î ¸Åΰú °Ë»öÇϱâ</title>
<para>
re_match_2 ¿Í re_search_2 ¸¦ »ç¿ëÇϸé, µÎ°³ÀÇ ¹®ÀÚ¿·Î ³ª´©¾îÁø
µ¥ÀÌÅ͸¦ ¸ÅĪ Çϰųª °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù.
<screen>
int re_match_2 (struct re_pattern_buffer *buffer,
const char *string1, const int size1,
const char *string2, const int size2,
const int start,
struct re_registers *regs,
const int stop)
</screen>
ÀÌ ÇÔ¼ö´Â re_match ¿Í, µÎ°³ µ¥ÀÌÅÍÀÇ ¹®ÀÚ¿°ú Å©±â¸¦ ³Ñ°ÜÁÖ°í,
ÀÌÈÄÀÇ ¸ÅĪÀ» ¿øÇÏÁö ¾ÊÀ» °æ¿ìÀÇ À妽º stop À» Á¦¿ÜÇϸé À¯»çÇÕ´Ï´Ù.
re_match ó·³, re_match_2 °¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾ú´Ù¸é, ¹®ÀÚ¿ string ¿¡¼
¸ÅĪµÈ Ƚ¼ö¸¦ µ¹·ÁÁÝ´Ï´Ù. re_match ´Â string1 °ú string2 ¸¦
start ¿Í stop ÀÎÀÚ¸¦ ¼³Á¤ÇÏ¿© regs ¸¦ »ç¿ëÇÒ ¶§ ¿¡´Â ¿¬¼ÓµÈ °ÍÀ¸·Î
Ãë±ÞÇÕ´Ï´Ù.
<screen>
int re_search_2 (struct re_pattern_buffer *buffer,
const char *string1, const int size1,
const char *string2, const int size2,
const int start,
struct re_registers *regs,
const int stop)
</screen>
À̰ÍÀº re_search ÇÔ¼ö¿Í À¯»çÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>fastmapÀ¸·Î °Ë»öÇϱâ</title>
<para>
¸î ½Ê¸¸¹ÙÀÌÆ® ÀÌ»ó µÇ´Â ¹®ÀÚ¿¿¡¼ °Ë»öÀ» ÇÏ·Á¸é fastmap À» »ç¿ëÇØ¾ß
ÇÕ´Ï´Ù. ¼øÂ÷ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ À§Ä¡¿¡¼ °Ë»öÀ» ÇÑ´Ù¸é ¾Æ¸¶µµ »ó´çÇÑ
½Ã°£ÀÌ °É¸± °ÍÀÔ´Ï´Ù. fastmap Àº ³»ºÎÀûÀÎ ¾Ë°í¸®ÁòÀ» À¯ÁöÇϸé¼
ÃÖÀûÀÇ °Ë»öÀ» ¼öÇàÇÕ´Ï´Ù.
</para>
<para>
¹®ÀÚ¿ °Ë»ö ½Ã È¿À²À» ³ôÀ̱â À§ÇÑ ¾Ë°í¸®ÁòÀº ¸¹ÀÌ ¿ì¸®µé¿¡°Ô
¾Ë·ÁÁ® ÀÖ½À´Ï´Ù. ±×µéÀÇ ¸¹Àº ºÎºÐµéÀº strstr°ú °°ÀÌ ¼øÂ÷ÀûÀ¸·Î
°Ë»öÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó °Ë»öÀÇ È¿À²À» ³ôÀ̱â À§Çؼ ³»ºÎÀÇ Å×À̺íÀ»
°®Ãß°í ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ°¡ °Ë»öÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ¼ö ÀÖ´ÂÁö¸¦ °Ë»çÇϸç
ÃÖ´ëÇÑÀÇ Æ÷ÀÎÅ͸¦ °Ç³Ê¶Ùµµ·Ï ¼³°èµÈ °æ¿ì°¡ ÀÖ½À´Ï´Ù.
</para>
<para>
fastmap À» ÀÌ·¯ÇÑ ¿ªÇÒÀ» ÇÏ´Â Å×ÀÌºí¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÔ´Ï´Ù.
Áï, ¿©·¯ºÐµéÀÇ ¹®ÀÚ¼Â(¾Æ½ºÅ°¹®ÀÚ µî)À¸·Î À妽ºµÈ ÇϳªÀÇ ¹è¿ÀÔ´Ï´Ù.
¾Æ½ºÅ° encoding ÇÏ¿¡¼´Â, µû¶ó¼, fastmap Àº 256 °³ÀÇ ¿ø¼Ò¸¦ °¡Áý´Ï´Ù.
ÁÖ¾îÁø ÆÐÅÏ ¹öÆÛ¿¡ ÀÖ¾î¼ °Ë»ö½Ã fastmap À» »ç¿ëÇÏ·Á°í ÇÒ ¶§¿¡´Â,
¸ÕÀú ¹è¿À» ÇÒ´çÇÏ°í ¹è¿ÀÇ ÁÖ¼Ò¸¦ ÆÐÅϹöÆÛÀÇ fastmap ¿¡ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù.
fastmap Àº ÀϹÝÀûÀ¸·Î »ç¿ëÀÚ°¡ Á÷Á¢ ÄÄÆÄÀÏÇϰųª ¶Ç´Â re_search°¡
´ë½Å ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.fastmapÀÌ ¾î¶² Å×À̺íÀ» °¡¸£Å°°í ÀÖ´Ù¸é,
re_search ´Â, ÄÄÆÄÀÏµÈ ÆÐÅϹöÆÛ¸¦ »ç¿ëÇÑ °Ë»öÀ» Çϱâ ÀÌÀü¿¡,
¸ÕÀú fastmap À» ÀÚµ¿ÀûÀ¸·Î ÄÄÆÄÀÏÇÕ´Ï´Ù.
</para>
<para>
Á÷Á¢ ¼öµ¿À¸·Î ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¸é µË´Ï´Ù.
<screen>
int re_compile_fastmap (struct re_pattern_buffer *pattern_buffer)
</screen>
pattern_buffer Àº ÆÐÅϹöÆÛÀÇ ÁÖ¼ÒÀÔ´Ï´Ù. ¾î¶°ÇÑ ¹®ÀÚ c °¡ ¸ÅĪ¿¡
ÀÖ¾î¼ ½ÃÀÛÁ¡ÀÌ µÉ ¼ö ÀÖ´Ù¸é, re_compile_fastmap Àº
'pattern_buffer->fastmap[c]'¸¦ 0ÀÌ ¾Æ´Ñ ¼ö·Î ÁöÁ¤À» ÇÕ´Ï´Ù.
ÀÌ ÇÔ¼ö°¡ fastmap À» ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ´Ù¸é 0À» ¸®ÅÏÇϰí,³»ºÎ¿¡·¯ÀÏ
°æ¿ì¿¡´Â -2¸¦ ¸®ÅÏÇÕ´Ï´Ù. ¿¹¸¦ µç´Ù¸é, ÆÐÅϹöÆÛ pattern_buffer
°¡ 'a|b' ¸¦ ÄÄÆÄÀÏÇÑ ÆÐÅÏÀ» º¸À¯Çϰí ÀÖ´Ù¸é, re_compile_fastmap Àº
fastmap['a'] ¿Í fastmap['b'] ¸¦ ¼¼Æ®ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. 'a' ¿Í 'b' ´Â
¸ÅĪÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ¼ö ÀÖÀ¸´Ï±î¿ä..
</para>
<para>
re_search ´Â ¹®ÀÚ¿ÀÇ °¢ ¿ø¼Òµé Áß¿¡¼ fastmap ¿¡ ÀÖ´Â °Í ÁßÀÇ Çϳª°¡
³ª¿Ã¶§±îÁö Â÷·Ê·Î ºñ±³ÇÕ´Ï´Ù. ±×¸®°í ³ª¼ ±× ¹®ÀÚ¿¡¼ºÎÅÍ ¸ÅĪÀ»
½ÃµµÇÕ´Ï´Ù. ¸ÅĪÀÌ ½ÇÆÐÇÒ °æ¿ì¿¡´Â ÀÌ·¯ÇÑ Ã³¸®¸¦ ¹Ýº¹ÇÕ´Ï´Ù. µû¶ó¼
ÀÌ·¸°Ô fastmap À» »ç¿ëÇÒ °æ¿ì, re_search ´Â ¸ÅĪÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ¼ö ¾ø´Â
¹®ÀÚ¿ÀÇ À§Ä¡¿¡¼ ¾µµ¥ ¾øÀÌ ¸ÅĪ ÇÏ·Á°í ÇÏ´Â ½Ãµµ¸¦ ÁÙÀÓÀ¸·Î½á ½Ã°£À»
Àý¾àÇÒ ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.
</para>
<para>
fastmap À» re_search ¿¡¼ »ç¿ëÇϱ⸦ ¿øÄ¡ ¾ÊÀ» °æ¿ì¿¡´Â fastmap Çʵ忡
NULL (0)À» ÀúÀåÇÏ¸é µË´Ï´Ù. ¹°·Ð re_search »ç¿ëÀÌÀü¿¡ ¸»ÀÌÁÒ...
</para>
<para>
ÆÐÅϹöÆÛÀÇ fastmap Çʵ带 Çѹø ÃʱâÈ Çß´Ù¸é ´Ù½Ã fastmap À» ÄÄÆÄÀÏ ÇÒ
ÇÊ¿ä´Â ¾ø½À´Ï´Ù. re_search ´Â fastmap ÀÌ NULL À̸é ÄÄÆÄÀÏÀ» ÇÏÁö
¾ÊÀ¸¸ç, NULL ÀÌ ¾Æ´Ï¶ó¸é »õ·Î¿î ÆÐÅÏ¿¡ »õ·Î¿î fastmap À» ÄÄÆÄÀÏÇÕ´Ï´Ù.
</para>
</section>
<section>
<title>GNU º¯È¯ Å×À̺í</title>
<para>
ÆÐÅϹöÆÛÀÇ translate Çʵ带 º¯È¯ Å×À̺í·Î ¼³Á¤ÇÏ¿´´Ù¸é, Regex ´Â ã´Â
¸ðµç ¹®ÀÚ¿°ú Á¤±ÔÇ¥Çö½Ä¿¡¼ °£´ÜÇÑ º¯È¯À» Çϱâ À§ÇØ translate ·Î
ÁöÁ¤µÈ º¯È¯ Å×À̺íÀ» »ç¿ëÇÕ´Ï´Ù.
</para>
<para>
"º¯È¯Å×À̺í" Àº ¾Æ½ºÅ°¿Í °°Àº ¹®ÀÚ¼¼Æ®ÀÇ ¿ø¼Òµé·Î À妽ºµÈ ¹è¿ÀÔ´Ï´Ù.
µû¶ó¼ ¾Æ½ºÅ°Äڵ忡¼´Â º¯È¯Å×À̺íÀº 256°³ÀÇ ¿ø¼Ò¸¦ °¡Áý´Ï´Ù. ÀÌ
¹è¿ÀÇ ¿ø¼Òµéµµ ¸¶Âù°¡Áö·Î ¿©·¯ºÐÀÇ ¹®ÀÚ¼¼Æ®¿¡ Æ÷ÇÔÀÌ µË´Ï´Ù.
Regex ÇÔ¼ö°¡ ¹®ÀÚ c¸¦ ¸¸³µ´Ù¸é, ¹®ÀÚ c ´ë½Å translate[c] ¸¦ »ç¿ëÇÕ´Ï´Ù.
°¡·É ´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÑ Regex ÀÏ °æ¿ì,
<screen>
translate['A'] = 'A';
translate['a'] = 'A';
translate['B'] = 'B';
translate['b'] = 'B';
............
</screen>
ÀÌ·¸°Ô °ªÀÌ ÃʱâÈ µÇ¾î ÀÖ´Ù¸é, ÀÌÈÄÀÇ Regex ÀÇ °Ë»ö½Ã 'a' ¹®ÀÚ¸¦
¸¸³´Ù¸é, 'a' ¸¦ º¯È¯Å×À̺íÀÇ À妽º·Î ÇÏ¿© ÇØ´ç°ªÀ¸·Î ´ë½ÅÇÑ´Ù´Â
À̾߱âÀÔ´Ï´Ù. ( translate['a'] ÀÇ °ªÀº 'A' À̹ǷΠ'a' ´ë½Å 'A' ÀÇ
°ªÀ» Àû¿ëÇÔ. )
</para>
<para>
±×·¯³ª, ´ÜÇѰ¡ÁöÀÇ ¿¹¿Ü°¡ ÀÖ´Ù¸é, '\' ¹®ÀÚ µÚ¿¡ µû¶ó¿À´Â ¹®ÀÚ´Â
º¯È¯ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀÔ´Ï´Ù. '\' ¹®ÀÚ°¡ À̽ºÄÉÀÌÇÁÀÇ ¿ªÇÒÀ» ÇÑ´Ù¸é, '
\B' ¿Í '\b' ´Â Ç×»ó ±¸º°µÇ´Â °ÍÀÔ´Ï´Ù.
</para>
<para>
ÀÌÁ¦ À§¿Í °°ÀÌ, ¼Ò¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯È¯ÇÏ´Â, ´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÏ´Â
º¯È¯Å×À̺íÀ» ÃʱâÈ ÇÏ´Â ¿¹¸¦ º¸À̰ڽÀ´Ï´Ù. (¸Þ´º¾ó¿¡ ³ª¿Í ÀÖ´Â
³»¿ëÀÔ´Ï´Ù. ^^)
<screen>
struct re_pattern_buffer pb; /* ÆÐÅÏ ¹öÆÛ */
char case_fold[256]; /* º¯È¯ Å×À̺í */
for (i = 0; i < 256; i++)
case_fold[i] = i;
for (i = 'a'; i <= 'z'; i++) /* ¼Ò¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯È¯ */
case_fold[i] = i - ('a' -'A');
pb.translate = case_fold;
</screen>
ÀÌ·¸°Ô translate ¿¡ º¯È¯ Å×À̺íÀÇ ÁÖ¼Ò¸¦ ÁöÁ¤Çϸé ÀÌÈÄ¿¡º¯È¯Å×À̺íÀ»
»ç¿ëÇÕ´Ï´Ù. º¯È¯Å×À̺íÀ» »ç¿ëÇÏ°í ½ÍÁö ¾Ê´Ù¸é translate ¿¡ NULL À»
³Ö¾îÁÖ½Ã¸é µË´Ï´Ù. ¸¸ÀÏ, ÆÐÅϹöÆÛ¸¦ ÄÄÆÄÀÏÇÒ ¶§³ª, fastmap À» ÄÄÆÄÀÏÇÒ
¶§, ÆÐÅϹöÆÛ·Î ¸ÅĪÀ̳ª °Ë»öÀ» ¼öÇàÇÒ ¶§ ÀÌ·¯ÇÑ Å×À̺íÀÇ ³»¿ëÀ» ¹Ù²Û´Ù¸é
ÀÌ»óÇÑ °á°ú¸¦ ¾òÀ» °ÍÀÔ´Ï´Ù.
</para>
</section>
<section>
<title>·¹Áö½ºÅÍ »ç¿ëÇϱâ</title>
<para>
»ç½Ç ÀÌ ºÎºÐÀÌ regex ¿¡¼ Áß¿äÇÑ ºÎºÐÀÔ´Ï´Ù.
Áö±Ý±îÁö´Â regex ¸¦ »ç¿ëÇÏ¿© ¾î¶² ¹®ÀÚ¿³»¿¡ ÇØ´ç ÆÐÅÏ(Á¤±ÔÇ¥Çö½Ä)ÀÌ
ÀÖ´À³Ä ¾ø´À³Ä¸¸ µûÁ³À¸³ª ÀÌ ·¹Áö½ºÅ͸¦ »ç¿ëÇÏ¸é ¼¼ºÎ ¸ÅĪÀÇ °á°ú¸¦
ÀúÀåÇÏ°Ô µË´Ï´Ù. Áï, ¹®ÀÚ¿ À妽º ¾îµð¿¡¼ ¾îµð±îÁö ÆÐÅϰú ¸ÅĪÀÌ
µÇ¾ú´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ È®º¸ÇÔÀ¸·Î½á ³ª¾Æ°¡¼´Â ¹®ÀÚ¿ ġȯ ÀÛ¾÷±îÁöµµ
»ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
<para>
Á¤±ÔÇ¥Çö½Ä¿¡¼ ÇϳªÀÇ ±×·ìÀº ÀüüÀûÀ¸·Î Á¤±ÔÇ¥Çö½Ä°ú ¸ÅĪµÇ´Â ¹®ÀÚ¿ÀÇ
ÇϳªÀÇ ºÎºÐ¹®ÀÚ¿°ú ¸ÅĪÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸ÅĪÀÛ¾÷À» ¼öÇàÇÒ ¶§ °¢°¢ÀÇ
±×·ì°ú ¸ÅĪµÈ º¸Á¶¹®ÀÚ¿ÀÇ ½ÃÀÛ°ú ³¡ÀÌ ±â¾ïµË´Ï´Ù.
</para>
<para>
ÀÌ·¯ÇÑ °Ë»öÀ̳ª ¸ÅĪ½Ã¿¡´Â GNU ¸ÅĪ ¹× °Ë»ö ÇÔ¼ö¿¡ 0ÀÌ ¾Æ´Ñ 'regs'
ÀÎÀÚ¸¦ ³Ñ°ÜÁà¾ß ÇÕ´Ï´Ù.
<screen>
struct re_registers {
unsigned num_regs;
regoff_t *start;
regoff_t *end;
};
</screen>
·¹Áö½ºÅÍ ¿É¼Â ŸÀÔ(regoff_t) ´Â 'int'¸¦ ÇüÁ¤ÀÇ ÇÑ °Í ÀÔ´Ï´Ù.
start ¿Í end ÀÇ i¹øÂ° ¿ø¼Ò´Â ÆÐÅÏ¿¡¼ÀÇ i¹øÂ° ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦
±â·ÏÇÕ´Ï´Ù. ÀÌ start ¿Í end ´Â ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ÇÒ´çµÇ´Â µ¥,
À̰ÍÀº ÆÐÅϹöÆÛÀÇ regs_allocated Çʵ忡 ÀÇÁ¸ÇÕ´Ï´Ù.
</para>
<para>
Á¦ÀÏ °£ÆíÇϰí À¯¿ëÇÑ ¹æ¹ýÀº regex ÀÇ ¸ÅĪÇÔ¼ö·Î ÇÏ¿©±Ý °¢°¢ÀÇ ±×·ì¿¡
´ëÇÑ Á¤º¸¸¦ ±â·ÏÇÒ °ø°£À» ÃæºÐÈ÷ ÇÒ´çÇÏ°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù.
regs_allocated °¡ REGS_UNALLOCATED ¶ó¸é, ¸ÅĪÇÔ¼ö´Â
1+re_nsub(ÆÐÅϹöÆÛÀÇ ´Ù¸¥ ¸â¹ö) ¸¸ÅÀ» ÇÒ´ç ÇÕ´Ï´Ù. ¿©ºÐÀÇ ¿ø¼Ò´Â -1 ·Î
¼³Á¤Çϰí, regs_allocated ¸¦ REGS_REALLOCATE ·Î¼³Á¤ÇÕ´Ï´Ù. ÀÌÈÄ¿¡ ´Ù½Ã
È£ÃâÇÒ °æ¿ì¿¡, ÇÊ¿äÇÏ´Ù¸é ¸ÅĪÇÔ¼ö´Â °ø°£À» ´õ ÇÒ´ç ÇÒ ¼ö ÀÖ½À´Ï´Ù.
</para>
<para>
re_compile_pattern Àº regs_allocated ¸¦ REGS_UNALLOCATED ·Î ¼³Á¤Çϱâ
¶§¹®¿¡, GNU Á¤±ÔÇ¥Çö½Ä ÇÔ¼ö¿¡¼´Â À§¿Í °°Àº ÇൿÀÌ ±âº»À¸·Î µÇ¾î ÀÖ½À´Ï´Ù.
</para>
<para>
POSIX ¿¡¼´Â Á¶±Ý ´Ù¸¨´Ï´Ù. È£ÃâÀÚ¿¡ ¸ÅĪÇÔ¼ö°¡ ä¿ï, °íÁ¤±æÀÌÀÇ ¹è¿À»
³Ñ°ÜÁà¾ß ÇÕ´Ï´Ù. µû¶ó¼ regs_allocated °¡ REGS_FIXED ¶ó¸é, ¸ÅĪÇÔ¼ö´Â
±× °íÁ¤¹è¿À» °£´ÜÇÏ°Ô Ã¤¿ó´Ï´Ù.
</para>
<para>
¾Æ·¡ÀÇ ¿¹Á¦´Â re_registers ±¸Á¶Ã¼¿¡ ±â·ÏµÇ´Â Á¤º¸¸¦ º¸¿©ÁÝ´Ï´Ù.
('(' ¿Í ')'ÀÌ ±×·ì¿ÀÆÛ·¹ÀÌÅͶó°í Çϰí, ¹®ÀÚ¿ string ¿¡¼ ù¹øÂ°
¹®ÀÚÀÇ À妽º¸¦ 0À̶ó ÇϰڽÀ´Ï´Ù.)
<orderedlist>
<listitem>
<para>
Á¤±ÔÇ¥Çö½ÄÀÌ ¶Ç´Ù¸¥ ±×·ìÀ» Æ÷ÇÔÇÏÁö ¾Ê´Â, i¹øÂ° ±×·ìÀ» °¡Áö°í
ÀÖ´Ù¸é, ÇÔ¼ö´Â 'regs->start[i]' ¿¡ ±×·ì°ú ¸ÅĪÇÏ´Â º¸Á¶¹®ÀÚ¿ÀÇ
½ÃÀÛ À妽º¸¦ ÀúÀåÇϰí, 'regs->end[i]' ¿¡´Â º¸Á¶¹®ÀÚ¿ÀÇ ³¡
À妽º¸¦ ÀúÀåÇÕ´Ï´Ù.
'regs->start[0]'°ú 'regs->end[0]' ¿¡´Â Àüü ÆÐÅÏ¿¡ ´ëÇÑ Á¤º¸°¡
µé¾î°©´Ï´Ù. ¿¹¸¦ µé¸é, 'ab' ¿¡ ´ëÇØ '((a)(b))' ¸¦ ¸ÅνÃŲ´Ù¸é,
´ÙÀ½ÀÇ °á°ú¸¦ ¾òÀ» °ÍÀÔ´Ï´Ù.
<screen>
* 0 in `regs->start[0]' and 2 in `regs->end[0]'
* 0 in `regs->start[1]' and 2 in `regs->end[1]'
* 0 in `regs->start[2]' and 1 in `regs->end[2]'
* 1 in `regs->start[3]' and 2 in `regs->end[3]'
</screen>
</para>
</listitem>
<listitem>
<para>
±×·ìÀÌ ¹Ýº¹¿ÀÆÛ·¹ÀÌÅÍ µîÀ» »ç¿ëÇÏ¿© Çѹøº¸´Ù ´õ ¸¹ÀÌ ¸ÅĪµÈ´Ù¸é,
ÇÔ¼ö´Â ¸¶Áö¸·À¸·Î ¸ÅĪµÈ ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÕ´Ï´Ù.
¿¹¸¦ µé¸é, 'aa' ¿¡ ´ëÇØ '(a)*' ¸¦ ¸ÅνÃŲ´Ù¸é, ´ÙÀ½ÀÇ °á°ú¸¦
¾òÀ» °ÍÀÔ´Ï´Ù.
<screen>
* 0 in `regs->start[0]' and 2 in `regs->end[0]'
* 1 in `regs->start[1]' and 2 in `regs->end[1]'
</screen>
¿©±â¿¡¼ ±×·ì 1 Àº '(a)' ÀÌÁö¸¸, µÚÀÇ '*' ¿ÀÆÛ·¹ÀÌÅÍ·Î ÀÎÇØ
'aa' ¿Í´Â 1¹øÃʰú ¸ÅĪµÇ¹Ç·Î, ¸¶Áö¸·¿¡ ¸ÅĪµÇ´Â 'a'¿¡ ´ëÇÑ À妽º¸¦
±â·ÏÇÕ´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
i¹øÂ° ±×·ìÀÌ, ¾î¶² ¼º°øÀûÀÎ ¸ÅĪ¿¡ °ü¿©ÇÏÁö ¾Ê´Â´Ù¸é,
¹Ýº¹¿ÀÆÛ·¹ÀÌÅÍ´Â 0¹ø ¹Ýº¹À» Çã¿ëÇϰí, ÇÔ¼ö´Â 'regs->start[i]' ¿Í
'regs->end[i]' ¸¦ -1·Î ä¿ó´Ï´Ù.
¿¹¸¦ µç´Ù¸é, 'b' ¿¡ ´ëÇØ '(a)*b' ¸¦ ¸ÅĪÇÏ´Â °æ¿ì´Â ´ÙÀ½ÀÇ °á°ú¸¦
¾òÀ» °ÍÀÔ´Ï´Ù.
<screen>
* 0 in `regs->start[0]' and 1 in `regs->end[0]'
* -1 in `regs->start[1]' and -1 in `regs->end[1]'
</screen>
¿©±â¿¡¼ 1¹øÂ° ±×·ìÀÎ '(a)' ´Â ¸ÅĪ¿¡ °ü¿©ÇÏÁö ¾Ê±â ¶§¹®¿¡
'regs->start[1]'°ú 'regs->end[1]' Àº -1·Î µË´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
i¹øÂ° ±×·ìÀÌ ±æÀ̰¡ 0ÀÎ ¹®ÀÚ¿À» ¸ÅĪÇÑ´Ù¸é, ÇÔ¼ö´Â regs->start[i] ¿Í
regs->end[i] ¸¦ "±æÀ̰¡ 0ÀÎ ¹®ÀÚ¿"ÀÇ À妽º·Î ¼³Á¤ÇÕ´Ï´Ù.
¿¹¸¦ µç´Ù¸é, 'b' ¿¡ ´ëÇØ '(a*)b' ¸¦ ¸ÅĪÇÏ´Â °æ¿ì´Â ´ÙÀ½ÀÇ °á°ú¸¦
¾òÀ» °ÍÀÔ´Ï´Ù.
<screen>
* 0 in `regs->start[0]' and 1 in `regs->end[0]'
* 0 in `regs->start[1]' and 0in `regs->end[1]'
</screen>
¿©±â¿¡¼ '(a*)b' ´Â À§ÀÇ '(a)*b' ¿Í´Â ´Ù¸¨´Ï´Ù. 1¹øÂ° ±×·ìÀÎ '(a*)'´Â
'b' ÀÇ ¾ÕºÎºÐÀÇ ºó ¹®ÀÚ¿°ú ¸ÅĪÀÌ µÇ¹Ç·Î regs->start[1]°ú
regs->end[1] Àº µÑ´Ù '0' ÀÌ µË´Ï´Ù.
</para>
</listitem>
<listitem>
<para>
i¹øÂ° ±×·ìÀÌ j¹øÂ° ±×·ìÀ» Æ÷ÇÔÇϰí, j¹øÂ° ±×·ìÀº i¹øÂ° ±×·ì¿¡¸¸
Æ÷ÇԵǴ °æ¿ì, ÇÔ¼ö´Â i¹øÂ° ±×·ìÀÇ ¸ÅĪÀ» ±â·ÏÇϰí,
regs->start[j] ¿Í regs->end[j]¿¡´Â j¹øÂ° ±×·ì°ú ¸¶Áö¸·À¸·Î ¸ÅεÈ
°Í¿¡ ´ëÇÑ Á¤º¸¸¦ ±â·ÏÇÕ´Ï´Ù.
</para>
<para>
Á¶±Ý ÇÞ°¥¸®±â ½¬¿î °æ¿ìÀε¥, ¿¹¸¦ µé¾îº¸Áö¿ä..
'abb' ¿¡ ´ëÇØ '((a*)b)*'¸¦ ¸ÅνÃŰ´Â °æ¿ì¸¦ º¾½Ã´Ù.
regs->start[0] °ú regs->end[0] Àº ´ç¿¬È÷ Àüü ¹®ÀÚ¿ÀÇ Á¤º¸¸¦ °¡Áö¹Ç·Î
0(ù¹øÂ° ¹®ÀÚ À妽º), 3(½ÃÀÛÀ妽º + ±æÀÌ·Î º¸´Â °ÍÀÌ ÁÁÀ» µí..)
À̵˴ϴÙ.
<screen>
((a*)b)* abb : 1¹øÂ° ±×·ì ù ¸ÅĪ (0, 2)
^^^^^^^ ^^
((a*)b)* abb : 2¹øÂ° ±×·ì ù ¸ÅĪ (0, 1)
^^^ ^
</screen>
óÀ½ÀÇ ¸ÅĪ¿¡¼, 1¹øÂ° ±×·ìÀº 'ab' ¿Í ¸ÅĪµÇ°í, 2¹øÂ° ±×·ìÀº
'a'¿Í ¸ÅĪµË´Ï´Ù.
<screen>
^^^^^^^
((a*)b)* abb : 1¹øÂ° ±×·ì µÑ° ¸ÅĪ (2, 3)
^ ^
^^^
((a*)b)* a b b : 2¹øÂ° ±×·ì µÑ° ¸ÅĪ (2, 2)
^ ^ (ºó¹®ÀÚ¿)
</screen>
¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍÀÇ ¿µÇâÀ¸·Î, µÎ¹øÂ° ¸ÅĪ¿¡¼, 1¹øÂ° ±×·ìÀº 'b'¿Í
¸ÅĪµÇ°í, 2¹øÂ° ±×·ìÀº ¸¶Áö¸· 'b' ÀÇ ¹Ù·Î ¾ÕÀÇ ºó¹®ÀÚ¿°ú ¸ÅĪµË´Ï´Ù.
</para>
<para>
µû¶ó¼, À§ÀÇ '¤¤' ±ÔÄ¢ (±×·ìÀÌ ¹Ýº¹¿ÀÆÛ·¹ÀÌÅÍ µîÀ» »ç¿ëÇÏ¿©
Çѹøº¸´Ù ´õ ¸¹ÀÌ ¸ÅĪµÈ´Ù¸é, ÇÔ¼ö´Â ¸¶Áö¸·À¸·Î ¸ÅĪµÈ ±×·ì¿¡ ´ëÇÑ
Á¤º¸¸¦ ÀúÀåÇÑ´Ù.) ¿¡ µû¶ó, regs->start[1], regs->end[1] ¿¡´Â 2, 3
ÀÌ °¢°¢ ±â·ÏµÇ¸ç, ±×·ì1Àº ±×·ì 2¸¦ Æ÷ÇÔÇÏ°í ±×·ì2´Â ±×·ì1¿¡¸¸
Æ÷ÇԵDZ⠶§¹®¿¡, ¸¶Áö¸·À¸·Î ¸ÅĪµÈ 2¹øÂ° ±×·ìÀÇ ±â·Ï°ªÀÎ 2, 2°¡
°¢°¢ regs->start[2] ¿Í regs->end[2] ¿¡ °¢°¢ ±â·ÏµË´Ï´Ù.
°á°ú¸¦ Á¤¸®Çϸé,
<screen>
* 0 in `regs->start[0]' and 3 in `regs->end[0]'
* 2 in `regs->start[1]' and 3 in `regs->end[1]'
* 2 in `regs->start[2]' and 2 in `regs->end[2]'
</screen>
</para>
<para>
'abb' ¿¡ ´ëÇØ '((a)*b)*' ¸¦ ¸ÅĪÇÑ´Ù¸é, ±×·ì2(°ýÈ£¾ÈÂÊÀÇ '(a)') ´Â
¸¶Áö¸· ¸ÅĪ¿¡ °ü¿©ÇÏÁö ¾ÊÀ¸¹Ç·Î ´ÙÀ½°ú °°Àº °á°ú¸¦ ¾ò½À´Ï´Ù.
<screen>
* 0 in `regs->start[0]' and 3 in `regs->end[0]'
* 2 in `regs->start[1]' and 3 in `regs->end[1]'
* 0 in `regs->start[2]' and 1 in `regs->end[2]'
</screen>
Á¶±Ý ÇÞ°¥¸®´Â ºÐµµ °è½Ç °ÍÀ̰í, Àç¹Ì¸¦ ´À³¢´Â ºÐµµ °è½Ç °ÍÀÔ´Ï´Ù. :)
</para>
</listitem>
<listitem>
<para>
À§¿Í °°À» °æ¿ì¿¡, ¸ÅĪÀÌ µÇÁö ¾ÊÀ» °æ¿ì, ÇÔ¼ö´Â regs->start[i],
regs->end[i]¿Í regs->start[j], regs->end[j] ¸¦ ¸ðµÎ -1 ·Î ¼³Á¤ÇÕ´Ï´Ù.
¿¹¸¦ µé¸é, 'c' ¿¡ ´ëÇØ '((a)*b)*c' ¸¦ ¸ÅĪÇÑ´Ù¸é, ´ÙÀ½ÀÇ °á°ú¸¦
¾òÀ» °ÍÀÔ´Ï´Ù.
<screen>
* 0 in `regs->start[0]' and 1 in `regs->end[0]'
* -1 in `regs->start[1]' and -1 in `regs->end[1]'
* -1 in `regs->start[2]' and -1 in `regs->end[2]'
</screen>
·¹Áö½ºÅÍ¿¡ ´ëÇÑ À̾߱â´Â À̰ɷΠ¸¶Ä¡°Ú½À´Ï´Ù.
</para>
</listitem>
</orderedlist>
</para>
</section>
<section>
<title>GNU ÆÐÅϹöÆÛ¸¦ free Çϱâ</title>
<para>
ÆÐÅϹöÆÛ¿¡¼ ÇÒ´çµÈ Çʵ带 free Çϱâ À§Çؼ´Â ÀÌÀü¿¡ ¼³¸íµå¸° POSIX ÇÔ¼ö
(6.2.6 ÀÇ regfree) ¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. POSIX ¿¡¼ »ç¿ëÇÏ´Â regex_t ´Â
GNU ÀÇ re_pattern_buffer ¿Í µ¿ÀÏÇÕ´Ï´Ù. ÆÐÅϹöÆÛ¸¦ free ÇÑ ÀÌÈÄ¿¡´Â, ¾î¶²
°Ë»ö°ú ¸ÅĪÀÛ¾÷À» ´Ù½Ã ¼öÇàÇÏ·Á¸é, Á¤±ÔÇ¥Çö½ÄÀ» ÆÐÅϹöÆÛ·Î ´Ù½Ã
ÄÄÆÄÀÏÇÏ¿©¾ß ÇÕ´Ï´Ù.
</para>
</section>
</section>
</section>
<section>
<title>³ª¿À´Â ¸»</title>
<para>
À̰ÍÀ¸·Î regex ÇÁ·Î±×·¡¹Ö °Á´ ¸¶Ä¡°Ú½À´Ï´Ù.
Àå½Ã°£ Áö·çÇϼÌÀ» ÅÙµ¥, »ç½Ç Á¤±ÔÇ¥Çö½Ä¸¸ ¾Ë·Á¸é regex ÇÁ·Î±×·¡¹Ö ºÎºÐÀº
´Ù Àؾî¹ö¸®¼Åµµ »ó°ü¾ø½À´Ï´Ù. ´Ù¸¸ sed ³ª awk °°Àº Á¤±ÔÇ¥Çö½ÄÀ» ÀνÄÇÏ´Â ÀÀ¿ë
ÇÁ·Î±×·¥À» ¸¸µå½Ã·Á¸é Àß ÀÍÇôµÎ½Ã´Â °ÍÀÌ ÁÁ½À´Ï´Ù.
</para>
<para>
Áö±Ý±îÁö Regex ¿¡ ´ëÇÑ À̾߱⸦ ¾²¸é¼, Regex ¸Þ´º¾óÀÇ ¹ø¿ªµµ ÇÏ¸é¼ (±âº»
ÀÚ·á°¡ ¾øÀ¸¹Ç·Î..), ¿¹Á¦µµ ¸¸µé¾î°¡¸é¼ ÁøÇàÇØ ¿Ô´Â µ¥, ¹ø¿ªÀÇ µüµüÇÔÀ»
¸¹Àº °÷¿¡¼ ´À³¥ ¼ö ¹Û¿¡ ¾ø´Â °Í °°¾Æ¼ Á¶±Ý ¾ÈŸ±õÁö¸¸, ±×·¡µµ Regex ÀÇ
´Ü¼ø ¹ø¿ªº»º¸´Ù´Â Á¶±ÝÀÌ¶óµµ ¾Ë±â½±°Ô ¼³¸íµå¸®Áö ¾Ê¾Ò³ª ÇÏ´Â °ÍÀ¸·Î À§¾ÈÀ»
»ï¾Æ¾ß°Ú±º¿ä. :) ¸¶Áö¸·À¸·Î regs ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ ÀÀ¿ë ¼Ò½º¸¦ ½Ã°£»óÀÇ
¹®Á¦·Î (»ç½Ç °Á¸¦ ³Ê¹« ¿À·¡ ²ø¾úÁÒ..^^) Ãß°¡ÇÏÁö ¸øÇÑ Á¡ ¾Æ½±Áö¸¸
¿©·¯ºÐµéÀÇ ¼÷Á¦·Î ³²°Ü µÎ°Ú½À´Ï´Ù.
±×·³...
</para>
</section>
</article>
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|