ȸ¿ø°¡ÀԡžÆÀ̵ð/ºñ¹øã±â
ȨÀ¸·Î


Á¤±ÔÇ¥Çö½Ä ÇÁ·Î±×·¡¹Ö °­Á (1 - 2)
13³â Àü
¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç¢Ç
¢Ç ¸ñÂ÷ ¢Ç
¢Ç ¢Ç
¢Ç 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)
À̳ª ¿ÀDZ׷쿬»êÀÚ('(')³ª ´ëü ¿¬»êÀÚ('|')ÀÇ ¹Ù·ÎµÚ(¿¹: (*.., |*)¿¡ ¿ÀÁö
¾ÊÀ» ¶§¿¡¸¸ ÀÌ°ÍÀ» ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍ·Î Ãë±ÞÇÕ´Ï´Ù.

* 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')
* ¶óÀÎÀÇ ½ÃÀÛ°ú ¸ÅĪµÇ´Â '^'³ª, ¿ÀDZ׷ì '('³ª, ´ëü ¿ÀÆÛ·¹ÀÌÅÍÀÎ '|' ¹Ù·Î
´ÙÀ½¿¡ À§Ä¡ÇÒ °æ¿ì ('^*', '(*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 °¡ ¼¼Æ®µÇ¾ú°í, °ñÈ£³ª ±×·ì..µîÀÇ ¹Û¿¡
ÀÖÀ» °æ¿ì
* ¿ÀDZ׷ìÀ̳ª ´ëü ¿ÀÆÛ·¹ÀÌÅÍ ´ÙÀ½¿¡ µû¶ó¿Ã °æ¿ì, ¿¹¸¦ µé¸é, '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' ¿¡ ´ëÀÀÇÏ´Â ¿¡·¯ ¹®ÀÚ¿­ÀÇ ¹Ù
ÃßõÃßõ : 167 Ãßõ ¸ñ·Ï
¹øÈ£ Á¦¸ñ
2,885
input ÀÔ·Â ÇÊµå ¾ÕµÚ °ø¹é ½Ç½Ã°£ Á¦°Å
2,884
Placeholder Æ÷Ä¿½º½Ã °¨Ãß±â
2,883
MySQL Áߺ¹µÈ µ¥ÀÌÅ͸¦ »èÁ¦
2,882
MySQL Áߺ¹ µ¥ÀÌÅÍ È®ÀÎ
2,881
sessionStorage.getItem ¿Í sessionStorage.setItem
2,880
Á¦ÀÌÄõ¸® ·£´ýÀ¸·Î ¹è°æ»ö º¯°æ
2,879
preg match¿¡ °üÇÑ Á¤±Ô½Ä
2,878
Stream an audio file with MediaPlayer ¿Àµð¿À ÆÄÀÏ ½ºÆ®¸®¹Ö Çϱâ
2,877
Audio Streaming PHP Code
2,876
PHP $ SERVER ȯ°æ º¯¼ö Á¤¸®
2,875
Vimeo (ºñ¸Þ¿À) API ¸¦ »ç¿ëÇÏ¿© Ç÷¹À̾î ÄÁÆ®·ÑÇϱâ
2,874
iframe »ç¿ë½Ã ÇÏ´Ü¿¡ ¹ß»ýÇÏ´Â °ø¹é Á¦°Å¹æ¹ý
2,873
¾ÆÀÌÇÁ·¹ÀÓ(iframe) Àüüȭ¸é °¡´ÉÇÏ°Ô Çϱâ
2,872
ºÎÆ®½ºÆ®·¦(bootstrapk)¿¡¼­ »ç¿ëÇÏ´Â class¸í Á¤¸®
2,871
ºÎÆ®½ºÆ®·¦ CSS
2,870
Å©·Ò¿¡¼­ ¸¶Áø Á¶Àý
2,869
PHP ÇöÀç ÆäÀÌÁöÀÇ µµ¸ÞÀθíÀ̳ª urlµîÀÇ Á¤º¸ ¾Ë¾Æ¿À±â
2,868
PHP preg match all()
2,867
PHP ·Î À¥ÆäÀÌÁö ±Ü¾î¿À±â ¸ðµç ¹æ¹ý ÃÑÁ¤¸®!
2,866
[PHP] ¿ø°ÝÁö ÆÄÀÏ ÁÖ¼Ò ³ëÃâ ¾ÈÇÏ°í curl·Î ´Ù¿î·Îµå ¹Þ±â
2,865
PHP ÇÔ¼ö Á¤¸®
2,864
¾ÆÀÌÇÁ·¹ÀÓ(iframe) ºñÀ² À¯ÁöÇϸ鼭 Å©±â Á¶ÀýÇÏ´Â ¹æ¹ý
2,863
PHP ¹è¿­¿¡¼­ ¹«ÀÛÀ§·Î Çϳª »Ì¾ÆÁÖ´Â array rand() ÇÔ¼ö
2,862
PHP Á¤±Ô½Ä Á¤¸®
2,861
PHP Á¤±Ô½ÄÀ» È°¿ëÇÑ ÅÂ±× ¹× ƯÁ¤ ¹®ÀÚ¿­ Á¦°Å ¹× ÃßÃâ ¹æ¹ý
2,860
php Å©·Ñ¸µ ¶Ç´Â ÆÄ½Ì ÇÔ¼ö, Á¤±Ô½Ä ¸ðÀ½
2,859
Á¦ÀÌÄõ¸® ±âº» ¸í·É¾î
2,858
À¥ÆäÀÌÁö °¡·Î ¸ðµå¼¼·Î ¸ðµå ÀνÄÇϱâ
2,857
¸ð¹ÙÀÏ À¥ È­¸é °­Á¦ ȸÀü(°¡·Î¸ðµå °íÁ¤)
2,856
[HTML5]¿¡¼­ frameset ´ëü ¹æ¹ý°ú iframe ¼Ó¼º
¸ñ·Ï
¹ÂÁ÷Æ®·ÎÆ® ºÎ»ê±¤¿ª½Ã ºÎ»êÁø±¸ °¡¾ßµ¿ ¤Ó °³ÀÎÁ¤º¸Ãë±Þ¹æħ
Copyright ¨Ï musictrot All rights reserved.