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


Á¤±ÔÇ¥Çö½Ä ÇÁ·Î±×·¡¹Ö °­Á (2 - 2)
13³â Àü
6.2.4 ¿¡·¯ ¸Þ½ÃÁö Ãâ·ÂÇϱâ
---------------------------

regcomp ³ª regexec °¡ ½ÇÆÐÇÏ°Ô µÇ¸é, 0ÀÌ ¾Æ´Ñ ¿¡·¯Äڵ带 ¹ÝȯÇÕ´Ï´Ù. ÀÌ·¯ÇÑ
¿¡·¯ÄÚµåµéÀº À§ÀÇ 6.2.2 ¿Í 6.2.3 ¿¡¼­ ¼³¸íÇÑ °ÍµéÀÔ´Ï´Ù. ¿¡·¯Äڵ忡 ÇØ´çÇÏ´Â
¿¡·¯ ¹®ÀÚ¿­À» ¾òÀ¸·Á¸é 'regerror'¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

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

'errcode' ´Â ¿¡·¯ÄÚµåÀÌ°í, 'preg' ´Â ¿¡·¯°¡ ¹ß»ýÇÑ ÆÐÅϹöÆÛÀ̸ç, 'errbuf' ´Â
¿¡·¯ ¹öÆÛÀ̸ç, 'errbuf_size' ´Â 'errbuf' ÀÇ Å©±âÀÔ´Ï´Ù.

regerror ´Â 'errcode' ¿¡ ´ëÀÀÇÏ´Â ¿¡·¯ ¹®ÀÚ¿­ÀÇ ¹ÙÀÌÆ® Å©±â(³Î¹®ÀÚ±îÁö Æ÷ÇÔ)
¸¦ ¹ÝȯÇÕ´Ï´Ù. 'errbuf' ¿Í 'errbuf_size' °¡ 0ÀÌ ¾Æ´Ï¶ó¸é, 'errbuf' ¿¡ óÀ½
errbuf_size-1 ¹®ÀÚÀÇ ¿¡·¯ ¹®ÀÚ¿­À» ³Î¹®ÀÚ¸¦ Ãß°¡Çؼ­ µ¹·ÁÁÝ´Ï´Ù.
'errbuf_size' ´Â 'errbuf' ÀÇ ¹ÙÀÌÆ® Å©±âº¸´Ù À۰ųª °°Àº ¾ç¼öÀ̾î¾ß ÇÕ´Ï´Ù.
¿©·¯ºÐµéÀº, 'regerror' ÀÇ ¿¡·¯ ¹®ÀÚ¿­À» ´ã¾Æ³»´Â µ¥ ¾ó¸¶¸¸Å­ Å©±âÀÇ'errbuf'
°¡ ÇÊ¿äÇÑÁö ¾Ë¾Æº¸±â À§Çؼ­ 'errbuf' ¸¦ NULL·Î, 'errbuf_size' ¸¦ 0À¸·Î Çؼ­
È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.

6.2.5 ¹ÙÀÌÆ® ¿É¼Â »ç¿ëÇϱâ
---------------------------

POSIX ¿¡¼­, regmatch_t Çü º¯¼ö´Â GNU ÀÇ ·¹Áö½ºÅÍ¿Í ºñ½ÁÇÏÁö¸¸, ¶È°°Áö´Â ¾Ê
½À´Ï´Ù. POSIX ¿¡¼­ ·¹Áö½ºÅÍÀÇ Á¤º¸¸¦ ¾òÀ¸·Á¸é regexec ¿¡, regmatch Çü º¯¼öÀÎ,
0ÀÌ ¾Æ´Ñ 'pmatch'¸¦ ³Ñ°ÜÁÙ ¼ö ÀÖ½À´Ï´Ù. regmatch_t Çü ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°½À
´Ï´Ù.

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

¸ÅĪ ÇÔ¼ö°¡ Á¤º¸¸¦¾î¶»°Ô ·¹Áö½ºÅÍ¿¡ ÀúÀåÇÏ´Â Áö´Â µÞºÎºÐ¿¡¼­ ¼³¸íÇÏ°Ú½À´Ï´Ù.

GNU Regex ÀÇ 'regs' ¿Í POSIX ÀÇ 'regs' ´Â À¯»çÇÏ°Ô ´ëÀÀÇÕ´Ï´Ù.

'reg' ÀÇ 'pmatch', pmatch[i]->rm_so ´Â regs->start[i] ¿Í ´ëÀÀÇÏ°í
pmatch[i]->rm_eo ´Â regs->end[i] ¿Í ´ëÀÀÇÕ´Ï´Ù.

6.2.6 POSIX ÆÐÅÏ ¹öÆÛ¸¦ Free Çϱâ
----------------------------------

ÆÐÅÏ ¹öÆÛ¿¡ ÇÒ´çµÈ °ÍÀ» free ÇÏ´Â ÇÔ¼ö´Â 'regfree' ÀÔ´Ï´Ù.

void regfree (regex_t *preg)

'preg' ´Â free ÇÒ, ÇÒ´çµÈ ÆÐÅϹöÆÛÀÔ´Ï´Ù. regfree ´Â ¶ÇÇÑ 'preg'ÀÇ 'allocated'
¿Í 'used' Çʵ带 0À¸·Î ¼³Á¤ÇÕ´Ï´Ù. ÆÐÅÏ ¹öÆÛ¸¦ free ÇÑ ÀÌÈÄ¿¡´Â, ¸ÅĪ ÀÛ¾÷À»
¼öÇàÇϱâ Àü¿¡ Á¤±ÔÇ¥Çö½ÄÀ» ÇØ´ç ÆÐÅÏ ¹öÆÛ¿¡ ´Ù½Ã ÄÄÆÄÀÏÇØ¾ß ÇÕ´Ï´Ù.

6.2.7 POSIX Regex ·Î egrep ¸¸µé±â
----------------------------------

grep Àº ±âº» Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ°í, egrep Àº È®Àå Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇϴµ¥,
¿©±â¼­´Â egrep ÀÇ ±â´ÉÀ» °£´ÜÇÏ°Ô ±¸ÇöÇØ º¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.

Áö±Ý±îÁö ¼³¸íÇÑ ±â´É¸¸À¸·Îµµ egrep ÀÇ ±âº»ÀûÀÎ ±â´ÉÀº ½±°Ô ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
grep ·ùÀÇ ±âº»ÀûÀÎ ±â´ÉÀº '¸ÅĪ' ÀÌ ¾Æ´Ï¶ó '°Ë»ö'À̱⠶§¹®ÀÔ´Ï´Ù.

¿ì¸®°¡ ¸¸µé'egrep' À» 'my_egrep' À̶ó°í ºÎ¸¥´Ù¸é, 'my_egrep' ÀÇ ±âº»ÀûÀÎ
ÀÛµ¿Àº ´ÙÀ½°ú °°ÀÌ Çϵµ·Ï ÇսôÙ.

1) Ưº°ÇÑ ¿É¼ÇÀº Áö¿øÇÏÁö ¾Ê°í, ÀÎÀÚ´Â ¸ðµÎ ÆÐÅÏÀ̳ª ÆÄÀϸíÀ¸·Î ó¸®ÇÑ´Ù.
2) ÀÔ·ÂÆÄÀϸíÀÌ ¸í½ÃµÇÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â Ç¥ÁØÀԷ¿¡¼­ ¹Þ´Â´Ù.
3) ÄÄÆÄÀÏ Ç÷¡±×´Â 'REG_EXTENDED' ¸¦ »ç¿ëÇÏ¿© È®ÀåÁ¤±ÔÇ¥Çö½ÄÀ» Áö¿øÇÑ´Ù.

Ãß°¡ÀûÀÎ ¿É¼ÇÀ» Áö¿øÇÏ´Â °ÍÀº ¼Ò½º¸¦ Á¶±Ý¾¿ °íÄ¡¸é¼­ ½ÃµµÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù.

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

/* POSIX Regex Å×½ºÆ® ÇÁ·Î±×·¥ : egrep ÀÇ ±âº» ±â´É ±¸Çö
*
* Designed by Han-donghun, 1997.5.31
*
* name    : my_egrep.c
*
* compile : First, you must have "regex.c" and "regex.h",
*              in the current directory.
*
*           To get "regex.o " , type "gcc -c regex.c"
*           Finally, to compile my_egrep.c, type follow.
*
*           "gcc -o my_egrep my_egrep.c regex.o"
*
* usage   : my_egrep pattern [files...]
*
* This is simple "pattern search" program
*        using POSIX regex, like egrep.
*/

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

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

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

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

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

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

´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÏ°Ô ¸¸µé·Á¸é, Á¤±ÔÇ¥Çö½ÄÀÇ ÄÄÆÄÀϽÿ¡, regcomp ÀÇ
REG_EXTENDED ¿¡ REG_ICASE ¸¦ Ãß°¡ÇÏ½Ã¸é µË´Ï´Ù (grep ·ùÀÇ '-i' ¿É¼Ç).
grep ·ùÀÇ '-v' ³ª -n' ¿É¼ÇÀ» Áö¿øÇÏ´Â °ÍÀº ÀÌÁ¦ °£´ÜÇÏ°Ô ÇØ°áµÉ °ÍÀÔ´Ï´Ù.

´ÙÀ½Àº Å×½ºÆ® ÇÑ °á°úÀÔ´Ï´Ù.

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

$ gcc -o my_egrep my_egrep.c regex.o
$ my_egrep regcomp Á¤±ÔÇ¥Çö½Ä°­ÁÂ.³×¹ø°
ÆÐÅÏ ¹öÆÛ¸¦ ÄÄÆÄÀÏÇÏ·Á¸é 'regcomp' ¸¦ »ç¿ëÇÕ´Ï´Ù.
  int regcomp (regex_t *preg, const char *regex, int cflags)
  ................
$ my_egrep "^[0-9]+\.[0-9]+\b" Á¤±ÔÇ¥Çö½Ä°­ÁÂ.³×¹ø°
6.2 POSIX Regex ÇÔ¼ö
6.2.1 POSIX ÆÐÅÏ ¹öÆÛ
6.2.2 POSIX Á¤±ÔÇ¥Çö½Ä ÄÄÆÄÀÏ
6.2.3 POSIX ¸ÅĪ
6.2.4 ¿¡·¯ ¸Þ½ÃÁö Ãâ·ÂÇϱâ
6.2.5 ¹ÙÀÌÆ® ¿É¼Â »ç¿ëÇϱâ
6.2.6 POSIX ÆÐÅÏ ¹öÆÛ¸¦ Free Çϱâ
6.2.7 POSIX Regex ·Î egrep ¸¸µé±â
$
----------------------------------------------------------------------------

(´ÙÀ½ ½Ã°£¿¡ À̾îÁý´Ï´Ù..)
                                                                              
¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 467¹ø
Á¦  ¸ñ:Á¤±ÔÇ¥Çö½Ä ÇÁ·Î±×·¡¹Ö °­Á [¸¶Áö¸·]
¿Ã¸°ÀÌ:¿¥ºê¸®¿À(À¯Çü¸ñ  )    97/06/15 13:46    ÀÐÀ½:1809 °ü·ÃÀÚ·á ¾øÀ½
-----------------------------------------------------------------------------
Çѵ¿ÈÆ´ÔÀÇ Á¤±Ô½Ä ¶óÀ̺귯¸® ¸¶Áö¸· °­ÁÂÀÔ´Ï´Ù.


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


#622   Çѵ¿ÈÆ   (ddoch   )
[°­ÁÂ] Regex (Á¤±ÔÇ¥Çö½Ä) ¶óÀ̺귯¸® (³¡     06/09 17:01   459 line

GNU REGEX (Á¤±ÔÇ¥Çö½Ä) ÇÁ·Î±×·¡¹Ö °­Á (5)
-------------------------------------------

6.3 GNU Regex ÇÔ¼ö
------------------

Ưº°È÷ POSIX ³ª ¹öŬ¸® UNIX ¿¡ ȣȯ¼ºÀ» »ý°¢ÇÏÁö ¾Ê¾Æµµ µÈ´Ù¸é, GNU regex
ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¿©·¯¸ð·Î ÁÁÀ» Áö ¸ð¸£°Ú½À´Ï´Ù.
GNU regex ÇÔ¼öµµ ÀÌÀü¿¡ ¼³¸íµå¸° POSIX ³ª BSD regex ÇÔ¼öÀÇ ±â´ÉÀ» Æ÷ÇÔÇÏ
°í ³ª¸ÓÁö ¿©·¯°³ÀÇ º¹ÀâÇÑ ±â´ÉÀ» Ãß°¡ÇÑ °ÍÀÔ´Ï´Ù.

±×·³, Çϳª¾¿ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.

6.3.1 GNU ÆÐÅÏ ¹öÆÛ
--------------------

GNU regex ´Â GNU ÆÐÅÏ ¹öÆÛ¸¦ ÀÌ¿ëÇÏ¿© ÄÄÆÄÀÏµÈ Á¤±ÔÇ¥Çö½ÄÀ» È°¿ëÇÕ´Ï´Ù.
ÀÌ ÆÐÅÏ ¹öÆÛ´Â POSIX regex ¿¡¼­ ¼³¸íÇÏ¿´À¸¹Ç·Î °Ç³Ê¶Ù°Ú½À´Ï´Ù.

6.3.2 GNU Á¤±ÔÇ¥Çö½Ä ÄÄÆÄÀÏ
----------------------------

GNU regex ¿¡¼­´Â Á¤±ÔÇ¥Çö½ÄÀ» °Ë»öÇÏ°í ¸ÅĪÇÏ´Â °ÍÀ» µÑ´Ù ÇÒ ¼ö ÀÖ½À´Ï´Ù.
GNU regex ¿¡¼­µµ POSIX ³ª BSD regex ó·³, ¸ÕÀú Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏÇÏ¿©, ÆÐÅÏ
¹öÆÛ¿¡ ¸¶·ÃÇØ µÎ¾î¾ß ÇÕ´Ï´Ù. ÀÌÀü°ú ¸¶Âù°¡Áö·Î ÆÐÅϹöÆÛ´Â ¾î¶² ¹®¹ýÀ¸·Î ÄÄÆÄ
ÀϵǴÀ³Ä¿¡ µû¶ó ¸ÅĪÀ̳ª °Ë»öÀÇ °á°ú°¡ ´Þ¶óÁö°Ô ¸¶·ÃÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¹®¹ýÀ» Áö
Á¤ÇÏ´Â º¯¼ö´Â re_syntax_options ÀÔ´Ï´Ù. µû¶ó¼­ ÄÄÆÄÀÏÀ» ÇϱâÀü¿¡ Á¤È®ÇÑ ¹®¹ý
À» ¼¼ÆÃÇØ µÎ´Â °ÍÀÌ Áß¿äÇÕ´Ï´Ù.

GNU regex ¿¡¼­ ÆÐÅÏÀ» ÄÄÆÄÀÏÇÏ´Â °ÍÀº, re_compile_pattern ÀÔ´Ï´Ù.
re_compile_pattern Àº ÆÐÅϹöÆÛ¸¦ ÀÎÀÚ·Î ÃëÇÏ´Â µ¥, ÆÐÅÏ ¹öÆÛÀÇ ´ÙÀ½ÀÇ Çʵå
´Â ÃʱâÈ­¸¦ ½ÃÄÑÁÖ¾î¾ß ÇÕ´Ï´Ù.

translate initialization
translate
         ¸ÅĪÀ̳ª °Ë»öÀÌÀü¿¡ Àû¿ëµÇ´Â º¯È¯Å×À̺íÀ» »ç¿ëÇÑ´Ù¸é ±× º¯È¯Å×À̺í
         ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ·Î ÃʱâÈ­ ½ÃÅ°ÁÝ´Ï´Ù. º¯È¯Å×À̺íÀÌ ¾ø´Ù¸é NULL·Î ÃÊ
         ±âÈ­ ½ÃÄÑÁÖ¸é µË´Ï´Ù. translate ´Â GNU ÆÐÅϹöÆÛ¿¡¼­ char * Çü Çʵå
         ÀÓÀ» »ó±âÇϼ¼¿ä.
         º¯È¯ Å×ÀÌºí¿¡ ´ëÇÑ À̾߱â´Â µÞÂÊ¿¡¼­ ¼³¸íÇÏ°Ú½À´Ï´Ù.

fastmap
         fastmap (re_search ·Î ºü¸¥ °Ë»ö¿¡ »ç¿ëµÊ) À» »ç¿ëÇÏ·Á¸é ±× Æ÷ÀÎÅ͸¦
         ÁöÁ¤ÇÏ¸é µÇ¸ç, ÇÊ¿ä¾ø´Ù¸é NULL·Î ÁöÁ¤ÇÏ¸é µË´Ï´Ù. ÀÌ ¶ÇÇÑ char * ÇÊ
         µå ÀÔ´Ï´Ù.

buffer
allocated
         re_compile_pattern À¸·Î ÄÄÆÄÀÏµÈ ÆÐÅÏ¿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í
         ÀÚ ÇÒ °æ¿ì¿¡´Â µÑ´Ù 0À̳ª NULL·Î ÃʱâÈ­ ÇÏ¸é µË´Ï´Ù. (buffer ´Â
         unsigned char *, allocated ´Â unsignedlong ÇüÀÔ´Ï´Ù. 0À̳ª NULLÀÌ
         ³ª °á±¹¿¡´Â 0ÀÔ´Ï´Ù.) ¿©·¯ºÐµéÀÌ ÀÌ¹Ì ÇÒ´çÇÑ ¸Þ¸ð¸® ºí·ÏÀ» Regex
         ¿¡ »ç¿ëÇÏ·Á¸é, buffer ´Â ±×°ÍÀÇ ÁÖ¼Ò·Î, allocated ´Â ºí·ÏÀÇ ¹ÙÀÌÆ®
         Å©±â·Î ¼³Á¤ÇÏ¸é µË´Ï´Ù.

         re_compile_pattern Àº ÄÄÆÄÀÏµÈ ÆÐÅÏ¿¡ ÇÊ¿äÇÏ´Ù¸é ¸Þ¸ð¸®¸¦ È®ÀåÇϱâ
         À§Çؼ­ realloc ¸¦ »ç¿ëÇÕ´Ï´Ù.


ÆÐÅÏÀ» ÄÄÆÄÀÏ ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¸é µË´Ï´Ù.

char *re_compile_pattern (const char *regex, const int regex_size,
                          struct re_pattern_buffer *pattern_buffer)

'regex' ´Â Á¤±ÔÇ¥Çö½Ä ¹®ÀÚ¿­ÀÇ ÁÖ¼ÒÀÌ°í, 'regex_size' ´Â ±×°ÍÀÇ ±æÀÌÀÔ´Ï´Ù.
pattern_buffer ´Â ÆÐÅϹöÆÛÀÇ ÁÖ¼ÒÀÔ´Ï´Ù.

re_compile_pattern ÀÌ ¼º°øÀûÀ¸·Î ÇØ´ç Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏÇÏ¿´´Ù¸é 0(NULL)À»
¸®ÅÏÇÏ°í, *pattern_buffer ¸¦ ÄÄÆÄÀÏµÈ ÆÐÅÏÀ¸·Î ¼³Á¤À» ÇÕ´Ï´Ù. ¾Æ¿ï·¯ ¾Æ·¡ÀÇ
ÆÐÅϹöÆÛ ³»ÀÇ Çʵ带 ¼¼ÆÃÇÕ´Ï´Ù.

buffer          ÄÄÆÄÀÏµÈ ÆÐÅÏ
used            buffer°¡ °¡¸£Å°´Â °÷¿¡¼­ »ç¿ëÁßÀÎ ¹ÙÀÌÆ®
syntax          re_syntax_options ÀÇ ÇöÀç°ª
re_nsub         'regex' ¿¡¼­ º¸Á¶Ç¥Çö½ÄÀÇ °¹¼ö
fastmap_accurate

re_compile_pattern ÀÌ 'regex' ¸¦ ÄÄÆÄÀÏ ÇÒ ¼ö ¾ø´Ù¸é, '6.2.2 POSIX Á¤±ÔÇ¥Çö½Ä'
¿¡¼­ ¼³¸íÇÑ ¿¡·¯ ¹®ÀÚ¿­À» µ¹·ÁÁÝ´Ï´Ù.

6.3.3 GNU ¸ÅĪ
---------------

GNU ¸ÅĪÀº ¹®ÀÚ¿­¼Ó¿¡¼­ °¡´ÉÇÑÇÑ ½ÃÀÛÀ§Ä¡¿¡¼­ ¸í½ÃµÈµ¥·Î ¸ÅĪÀ» ½Ãŵ´Ï´Ù.
Çѹø ÆÐÅÏÀ» ÆÐÅϹöÆÛ·Î ÄÄÆÄÀÏÀ» Çß´Ù¸é, ¹®ÀÚ¿­¿¡¼­ ÆÐÅÏÀ» ¸ÅĪ ½Ãų¼ö ÀÖ½À´Ï
´Ù.

int re_match (struct re_pattern_buffer *pattern_buffer,
              const char *string, const int size,
              const int start, struct re_registers *regs)

pattern_buffer Àº ÄÄÆÄÀÏµÈ ÆÐÅϹöÆÛÀÇ ÁÖ¼ÒÀÌ°í, string Àº ¸ÅĪÀ» ÇÏ°íÀÚ ÇÏ´Â
¹®ÀÚ¿­ÀÔ´Ï´Ù. ÀÌ ¹®ÀÚ¿­¿¡´Â NULL À̳ª newline À» Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù. size ´Â
±× ¹®ÀÚ¿­ÀÇ ±æÀÌÀ̸ç, start ´Â ¸ÅĪÇϱ⸦ ¿øÇÏ´Â ¹®ÀÚ¿­¼ÓÀÇ À妽º(¹®ÀÚ¿­ ù
¹®ÀÚÀÇ À妽º´Â 0)ÀÔ´Ï´Ù.

re_match ´Â pattern_buffer ÀÇ syntax ÇʵåÀÇ ¹®¹ý¿¡ µû¶ó, ¹®ÀÚ¿­ string À»,
pattern_bufferÀÇ Á¤±Ô Ç¥Çö½Ä°ú ¸ÅĪÀ» ½ÃÅ°´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. ¹®ÀÚ¿­°ú ¸ÅĪÇÒ
¼ö ¾ø´Ù¸é -1À» ¸®ÅÏÇÏ°í, ³»ºÎÀûÀÎ ¿¡·¯ÀÏ °æ¿ì¿¡´Â -2¸¦, ¼º°øÀûÀÏ °æ¿ì¿¡´Â
¹®ÀÚ¿­°ú ¸ÅĪµÈ Ƚ¼ö¸¦ µ¹·ÁÁÝ´Ï´Ù.

¿¹¸¦ µé¸é, 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À» ¹ÝȯÇÕ´Ï´Ù.

6.3.4 GNU °Ë»ö
---------------

°Ë»öÇÏ´Â µ¥ »ç¿ëµÇ´Â ÇÔ¼ö´Â re_search ÀÔ´Ï´Ù.

re_search ¸¦ »ç¿ëÇϱâ Àü¿¡ Á¤±ÔÇ¥Çö½ÄÀ» ÄÄÆÄÀÏ ÇÏ¼Å¾ß °ÚÁÒ?
re_search ÀÇ Á¤ÀÇ´Â ´ÙÀ½°ú °°½À´Ï´Ù.

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)

ÀÌ ÀÎÀÚµéÀº re_match ¿Í À¯»çÇÕ´Ï´Ù. ¿©±â¼­ start ¿Í range ´Â re_match ÀÇ
start ¸¦ ´ëÀÀÇÕ´Ï´Ù.

range °¡ ¾ç¼öÀ̸é, re_search ´Â À妽º start ¿¡¼­ ÃÖÃÊÀÇ ¸ÅĪÀ» ½ÃÀÛÇϸç
½ÇÆÐÇÒ °æ¿ì start+1 ¿¡¼­ °Ë»öÀ» ÇÏ¸ç °è¼Ó Çϳª¾¿ ³ª¾Æ°¡¼­ start+range ±îÁö
¼öÇàÇÕ´Ï´Ù. range °¡ À½¼ö¶ó¸é, À妽º start ¿¡¼­ ù ¸ÅĪÀ» ¼öÇàÇϸç, ÀÌÈÄ¿¡
-1¾¿ À§Ä¡¸¦ ¹Ý´ë·Î ¿Å°Ü¼­ ¼öÇàÇÕ´Ï´Ù.

start °¡ 0¿¡¼­ size »çÀÌ°¡ ¾Æ´Ï¶ó¸é, re_search ´Â -1À» µ¹·ÁÁÝ´Ï´Ù. range °¡
¾ç¼öÀÏ °æ¿ì¿¡´Â re_search ´Â, ÇÊ¿äÇÏ´Ù¸é range ¸¦ Á¶ÀýÇؼ­ start+range-1 ÀÌ
0¿¡¼­ size »çÀÌ°¡ µÇµµ·Ï ÇÏ¿© °Ë»öÀÌ ¹®ÀÚ¿­ ¹Ù±ùÀ¸·Î ³ª°¡Áö ¸øÇϵµ·Ï ÇÕ´Ï´Ù.
À¯»çÇÏ°Ô, range °¡ À½¼ö¶ó¸é, re_search ´Â ¹üÀ§¸¦ start+range+1 ÀÌ 0¿¡¼­ size
»çÀÌ°¡ µÇµµ·Ï ÇÊ¿äÇÒ °æ¿ì Á¶ÀýÇÏ°Ô µË´Ï´Ù.

ÆÐÅϹöÆÛÀÇ fastmap Çʵ尡 NULL À̶ó¸é, re_search ´Â ¿¬¼ÓÀûÀÎ À§Ä¡·Î ¸ÅĪÀ» ½Ã
ÀÛÇϸç, NULL ÀÌ ¾Æ´Ï¶ó¸é, fastmap À» »ç¿ëÇÏ¿© Á» ´õ È¿À²ÀûÀ¸·Î °Ë»öÀ» ¼öÇàÇÕ
´Ï´Ù.

¸ÅĪÀÌ Çѹøµµ µÇÁö ¾Ê´Â´Ù¸é, re_search ´Â -1À» ¹ÝȯÇÏ°í, ¸ÅĪÀÌ µÈ´Ù¸é ¸ÅĪÀÌ
½ÃÀÛµÈ À§Ä¡ÀÇ À妽º¸¦ µ¹·ÁÁÖ¸ç, ³»ºÎ¿¡·¯ÀÏ °æ¿ì¿¡´Â -2¸¦ µ¹·ÁÁÝ´Ï´Ù.

6.3.5 ºÐ¸®µÈ µ¥ÀÌÅÍ·Î ¸ÅĪ°ú °Ë»öÇϱâ
--------------------------------------

re_match_2 ¿Í re_search_2 ¸¦ »ç¿ëÇϸé, µÎ°³ÀÇ ¹®ÀÚ¿­·Î ³ª´©¾îÁø µ¥ÀÌÅ͸¦ ¸ÅĪ
Çϰųª °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù.

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)


ÀÌ ÇÔ¼ö´Â re_match ¿Í, µÎ°³ µ¥ÀÌÅÍÀÇ ¹®ÀÚ¿­°ú Å©±â¸¦ ³Ñ°ÜÁÖ°í, ÀÌÈÄÀÇ ¸ÅĪÀ»
¿øÇÏÁö ¾ÊÀ» °æ¿ìÀÇ À妽º stop À» Á¦¿ÜÇϸé À¯»çÇÕ´Ï´Ù.
re_match ó·³, re_match_2 °¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾ú´Ù¸é, ¹®ÀÚ¿­ string ¿¡¼­ ¸Å
ĪµÈ Ƚ¼ö¸¦ µ¹·ÁÁÝ´Ï´Ù. re_match ´Â string1 °ú string2 ¸¦, start ¿Í stop ÀÎ
ÀÚ¸¦ ¼³Á¤ÇÏ¿© regs ¸¦ »ç¿ëÇÒ ¶§ ¿¡´Â ¿¬¼ÓµÈ °ÍÀ¸·Î Ãë±ÞÇÕ´Ï´Ù.

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)

ÀÌ°ÍÀº re_search ÇÔ¼ö¿Í À¯»çÇÕ´Ï´Ù.

6.3.6 fastmap À¸·Î °Ë»öÇϱâ
----------------------------

¸î ½Ê¸¸¹ÙÀÌÆ® ÀÌ»ó µÇ´Â ¹®ÀÚ¿­¿¡¼­ °Ë»öÀ» ÇÏ·Á¸é fastmap À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.
¼øÂ÷ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ À§Ä¡¿¡¼­ °Ë»öÀ» ÇÑ´Ù¸é ¾Æ¸¶µµ »ó´çÇÑ ½Ã°£ÀÌ °É¸± °ÍÀÔ´Ï´Ù
. fastmap Àº ³»ºÎÀûÀÎ ¾Ë°í¸®ÁòÀ» À¯ÁöÇϸ鼭 ÃÖÀûÀÇ °Ë»öÀ» ¼öÇàÇÕ´Ï´Ù.

¹®ÀÚ¿­ °Ë»ö ½Ã È¿À²À» ³ôÀ̱â À§ÇÑ ¾Ë°í¸®ÁòÀº ¸¹ÀÌ ¿ì¸®µé¿¡°Ô ¾Ë·ÁÁ® ÀÖ½À´Ï´Ù.
±×µéÀÇ ¸¹Àº ºÎºÐµéÀº strstr°ú °°ÀÌ ¼øÂ÷ÀûÀ¸·Î °Ë»öÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó °Ë»öÀÇ È¿
À²À» ³ôÀ̱â À§Çؼ­ ³»ºÎÀÇ Å×À̺íÀ» °®Ãß°í ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ°¡ °Ë»öÀÇ ½ÃÀÛÁ¡ÀÌ
µÉ ¼ö ÀÖ´ÂÁö¸¦ °Ë»çÇϸç ÃÖ´ëÇÑÀÇ Æ÷ÀÎÅ͸¦ °Ç³Ê¶Ùµµ·Ï ¼³°èµÈ °æ¿ì°¡ ÀÖ½À´Ï´Ù.

fastmap À» ÀÌ·¯ÇÑ ¿ªÇÒÀ» ÇÏ´Â Å×ÀÌºí¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÔ´Ï´Ù.
Áï, ¿©·¯ºÐµéÀÇ ¹®ÀÚ¼Â(¾Æ½ºÅ°¹®ÀÚ µî)À¸·Î À妽ºµÈ ÇϳªÀÇ ¹è¿­ÀÔ´Ï´Ù. ¾Æ½ºÅ°
encoding ÇÏ¿¡¼­´Â, µû¶ó¼­, fastmap Àº 256 °³ÀÇ ¿ø¼Ò¸¦ °¡Áý´Ï´Ù. ÁÖ¾îÁø ÆÐÅÏ
¹öÆÛ¿¡ À־ °Ë»ö½Ã fastmap À» »ç¿ëÇÏ·Á°í ÇÒ ¶§¿¡´Â, ¸ÕÀú ¹è¿­À» ÇÒ´çÇÏ°í
¹è¿­ÀÇ ÁÖ¼Ò¸¦ ÆÐÅϹöÆÛÀÇ fastmap ¿¡ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù. fastmap Àº ÀϹÝÀûÀ¸·Î »ç
¿ëÀÚ°¡ Á÷Á¢ ÄÄÆÄÀÏÇϰųª ¶Ç´Â re_search°¡ ´ë½Å ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.fastmap ÀÌ
¾î¶² Å×À̺íÀ» °¡¸£Å°°í ÀÖ´Ù¸é, re_search ´Â, ÄÄÆÄÀÏµÈ ÆÐÅϹöÆÛ¸¦ »ç¿ëÇÑ °Ë»öÀ»
Çϱâ ÀÌÀü¿¡, ¸ÕÀú fastmap À» ÀÚµ¿ÀûÀ¸·Î ÄÄÆÄÀÏÇÕ´Ï´Ù.

Á÷Á¢ ¼öµ¿À¸·Î ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¸é µË´Ï´Ù.

int re_compile_fastmap (struct re_pattern_buffer *pattern_buffer)

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' ´Â ¸ÅĪÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ¼ö ÀÖÀ¸´Ï±î¿ä..

re_search ´Â ¹®ÀÚ¿­ÀÇ °¢ ¿ø¼Òµé Áß¿¡¼­ fastmap ¿¡ ÀÖ´Â °Í ÁßÀÇ Çϳª°¡ ³ª¿Ã¶§
±îÁö Â÷·Ê·Î ºñ±³ÇÕ´Ï´Ù. ±×¸®°í ³ª¼­ ±× ¹®ÀÚ¿¡¼­ºÎÅÍ ¸ÅĪÀ» ½ÃµµÇÕ´Ï´Ù. ¸ÅĪÀÌ
½ÇÆÐÇÒ °æ¿ì¿¡´Â ÀÌ·¯ÇÑ Ã³¸®¸¦ ¹Ýº¹ÇÕ´Ï´Ù. µû¶ó¼­ ÀÌ·¸°Ô fastmap À» »ç¿ëÇÒ °æ
¿ì, re_search ´Â ¸ÅĪÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ¼ö ¾ø´Â ¹®ÀÚ¿­ÀÇ À§Ä¡¿¡¼­ ¾µµ¥ ¾øÀÌ ¸ÅĪ
ÇÏ·Á°í ÇÏ´Â ½Ãµµ¸¦ ÁÙÀÓÀ¸·Î½á ½Ã°£À» Àý¾àÇÒ ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.

fastmap À» re_search ¿¡¼­ »ç¿ëÇϱ⸦ ¿øÄ¡ ¾ÊÀ» °æ¿ì¿¡´Â fastmap Çʵ忡 NULL
(0)À» ÀúÀåÇÏ¸é µË´Ï´Ù. ¹°·Ð re_search »ç¿ëÀÌÀü¿¡ ¸»ÀÌÁÒ...

ÆÐÅϹöÆÛÀÇ fastmap Çʵ带 Çѹø ÃʱâÈ­ Çß´Ù¸é ´Ù½Ã fastmap À» ÄÄÆÄÀÏ ÇÒ ÇÊ¿ä´Â
¾ø½À´Ï´Ù. re_search ´Â fastmap ÀÌ NULL À̸é ÄÄÆÄÀÏÀ» ÇÏÁö ¾ÊÀ¸¸ç, NULL ÀÌ ¾Æ
´Ï¶ó¸é »õ·Î¿î ÆÐÅÏ¿¡ »õ·Î¿î fastmap À» ÄÄÆÄÀÏÇÕ´Ï´Ù.

6.3.7 GNU º¯È¯ Å×À̺í
----------------------

ÆÐÅϹöÆÛÀÇ translate Çʵ带 º¯È¯ Å×À̺í·Î ¼³Á¤ÇÏ¿´´Ù¸é, Regex ´Â ã´Â ¸ðµç
¹®ÀÚ¿­°ú Á¤±ÔÇ¥Çö½Ä¿¡¼­ °£´ÜÇÑ º¯È¯À» Çϱâ À§ÇØ translate ·Î ÁöÁ¤µÈ º¯È¯
Å×À̺íÀ» »ç¿ëÇÕ´Ï´Ù.

"º¯È¯Å×À̺í" Àº ¾Æ½ºÅ°¿Í °°Àº ¹®ÀÚ¼¼Æ®ÀÇ ¿ø¼Òµé·Î À妽ºµÈ ¹è¿­ÀÔ´Ï´Ù.
µû¶ó¼­ ¾Æ½ºÅ°Äڵ忡¼­´Â º¯È¯Å×À̺íÀº 256°³ÀÇ ¿ø¼Ò¸¦ °¡Áý´Ï´Ù. ÀÌ ¹è¿­ÀÇ ¿ø¼Ò
µéµµ ¸¶Âù°¡Áö·Î ¿©·¯ºÐÀÇ ¹®ÀÚ¼¼Æ®¿¡ Æ÷ÇÔÀÌ µË´Ï´Ù. Regex ÇÔ¼ö°¡ ¹®ÀÚ c¸¦ ¸¸
³µ´Ù¸é, ¹®ÀÚ c ´ë½Å translate[c] ¸¦ »ç¿ëÇÕ´Ï´Ù.

°¡·É ´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÑ Regex ÀÏ °æ¿ì,

translate['A'] = 'A';
translate['a'] = 'A';
translate['B'] = 'B';
translate['b'] = 'B';
............

ÀÌ·¸°Ô °ªÀÌ ÃʱâÈ­ µÇ¾î ÀÖ´Ù¸é, ÀÌÈÄÀÇ Regex ÀÇ °Ë»ö½Ã 'a' ¹®ÀÚ¸¦ ¸¸³­´Ù¸é,
'a' ¸¦ º¯È¯Å×À̺íÀÇ À妽º·Î ÇÏ¿© ÇØ´ç°ªÀ¸·Î ´ë½ÅÇÑ´Ù´Â À̾߱âÀÔ´Ï´Ù.
( translate['a'] ÀÇ °ªÀº 'A' À̹ǷΠ'a' ´ë½Å 'A' ÀÇ °ªÀ» Àû¿ëÇÔ. )

±×·¯³ª, ´ÜÇÑ°¡ÁöÀÇ ¿¹¿Ü°¡ ÀÖ´Ù¸é, '\' ¹®ÀÚ µÚ¿¡ µû¶ó¿À´Â ¹®ÀÚ´Â º¯È¯ÇÏÁö ¾Ê
´Â´Ù´Â °ÍÀÔ´Ï´Ù. '\' ¹®ÀÚ°¡ À̽ºÄÉÀÌÇÁÀÇ ¿ªÇÒÀ» ÇÑ´Ù¸é, '\B' ¿Í '\b' ´Â Ç×
»ó ±¸º°µÇ´Â °ÍÀÔ´Ï´Ù.

ÀÌÁ¦ À§¿Í °°ÀÌ, ¼Ò¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯È¯ÇÏ´Â, ´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÏ´Â º¯È¯Å×À̺íÀ»
ÃʱâÈ­ ÇÏ´Â ¿¹¸¦ º¸ÀÌ°Ú½À´Ï´Ù. (¸Þ´º¾ó¿¡ ³ª¿Í ÀÖ´Â ³»¿ëÀÔ´Ï´Ù. ^^)

    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;

ÀÌ·¸°Ô translate ¿¡ º¯È¯ Å×À̺íÀÇ ÁÖ¼Ò¸¦ ÁöÁ¤Çϸé ÀÌÈÄ¿¡º¯È¯Å×À̺íÀ» »ç¿ëÇÕ
´Ï´Ù. º¯È¯Å×À̺íÀ» »ç¿ëÇÏ°í ½ÍÁö ¾Ê´Ù¸é translate ¿¡ NULL À» ³Ö¾îÁÖ½Ã¸é µË
´Ï´Ù. ¸¸ÀÏ, ÆÐÅϹöÆÛ¸¦ ÄÄÆÄÀÏÇÒ ¶§³ª, fastmap À» ÄÄÆÄÀÏÇÒ ¶§, ÆÐÅϹöÆÛ·Î ¸ÅĪ
À̳ª °Ë»öÀ» ¼öÇàÇÒ ¶§ ÀÌ·¯ÇÑ Å×À̺íÀÇ ³»¿ëÀ» ¹Ù²Û´Ù¸é ÀÌ»óÇÑ °á°ú¸¦ ¾òÀ» °Í
ÀÔ´Ï´Ù.

6.3.8 ·¹Áö½ºÅÍ »ç¿ëÇϱâ
------------------------

»ç½Ç ÀÌ ºÎºÐÀÌ regex ¿¡¼­ Áß¿äÇÑ ºÎºÐÀÔ´Ï´Ù.

Áö±Ý±îÁö´Â regex ¸¦ »ç¿ëÇÏ¿© ¾î¶² ¹®ÀÚ¿­³»¿¡ ÇØ´ç ÆÐÅÏ(Á¤±ÔÇ¥Çö½Ä)ÀÌ ÀÖ´À³Ä
¾ø´À³Ä¸¸ µûÁ³À¸³ª ÀÌ ·¹Áö½ºÅ͸¦ »ç¿ëÇÏ¸é ¼¼ºÎ ¸ÅĪÀÇ °á°ú¸¦ ÀúÀåÇÏ°Ô µË´Ï´Ù.
Áï, ¹®ÀÚ¿­ À妽º ¾îµð¿¡¼­ ¾îµð±îÁö ÆÐÅÏ°ú ¸ÅĪÀÌ µÇ¾ú´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ È®
º¸ÇÔÀ¸·Î½á ³ª¾Æ°¡¼­´Â ¹®ÀÚ¿­ ġȯ ÀÛ¾÷±îÁöµµ »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.

Á¤±ÔÇ¥Çö½Ä¿¡¼­ ÇϳªÀÇ ±×·ìÀº ÀüüÀûÀ¸·Î Á¤±ÔÇ¥Çö½Ä°ú ¸ÅĪµÇ´Â ¹®ÀÚ¿­ÀÇ Çϳª
ÀÇ ºÎºÐ¹®ÀÚ¿­°ú ¸ÅĪÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸ÅĪÀÛ¾÷À» ¼öÇàÇÒ ¶§ °¢°¢ÀÇ ±×·ì°ú ¸ÅĪ
µÈ º¸Á¶¹®ÀÚ¿­ÀÇ ½ÃÀÛ°ú ³¡ÀÌ ±â¾ïµË´Ï´Ù.

ÀÌ·¯ÇÑ °Ë»öÀ̳ª ¸ÅĪ½Ã¿¡´Â GNU ¸ÅĪ ¹× °Ë»ö ÇÔ¼ö¿¡ 0ÀÌ ¾Æ´Ñ 'regs' ÀÎÀÚ¸¦ ³Ñ
°ÜÁà¾ß ÇÕ´Ï´Ù.

struct re_registers {
  unsigned num_regs;
  regoff_t *start;
  regoff_t *end;
};

·¹Áö½ºÅÍ ¿É¼Â ŸÀÔ(regoff_t) ´Â 'int'¸¦ ÇüÁ¤ÀÇ ÇÑ °Í ÀÔ´Ï´Ù.

start ¿Í end ÀÇ i¹ø° ¿ø¼Ò´Â ÆÐÅÏ¿¡¼­ÀÇ i¹ø° ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ±â·ÏÇÕ´Ï´Ù.
ÀÌ start ¿Í end ´Â ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ÇÒ´çµÇ´Â µ¥, ÀÌ°ÍÀº ÆÐÅϹöÆÛÀÇ
regs_allocated Çʵ忡 ÀÇÁ¸ÇÕ´Ï´Ù.

Á¦ÀÏ °£ÆíÇÏ°í À¯¿ëÇÑ ¹æ¹ýÀº regex ÀÇ ¸ÅĪÇÔ¼ö·Î ÇÏ¿©±Ý °¢°¢ÀÇ ±×·ì¿¡ ´ëÇÑ Á¤
º¸¸¦ ±â·ÏÇÒ °ø°£À» ÃæºÐÈ÷ ÇÒ´çÇÏ°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. regs_allocated °¡
REGS_UNALLOCATED ¶ó¸é, ¸ÅĪÇÔ¼ö´Â 1+re_nsub(ÆÐÅϹöÆÛÀÇ ´Ù¸¥ ¸â¹ö) ¸¸Å­À» ÇÒ´ç
ÇÕ´Ï´Ù. ¿©ºÐÀÇ ¿ø¼Ò´Â -1 ·Î ¼³Á¤ÇÏ°í, regs_allocated ¸¦ REGS_REALLOCATE ·Î
¼³Á¤ÇÕ´Ï´Ù. ÀÌÈÄ¿¡ ´Ù½Ã È£ÃâÇÒ °æ¿ì¿¡, ÇÊ¿äÇÏ´Ù¸é ¸ÅĪÇÔ¼ö´Â °ø°£À» ´õ ÇÒ´ç
ÇÒ ¼ö ÀÖ½À´Ï´Ù.

re_compile_pattern Àº regs_allocated ¸¦ REGS_UNALLOCATED ·Î ¼³Á¤Çϱ⠶§¹®¿¡,
GNU Á¤±ÔÇ¥Çö½Ä ÇÔ¼ö¿¡¼­´Â À§¿Í °°Àº ÇൿÀÌ ±âº»À¸·Î µÇ¾î ÀÖ½À´Ï´Ù.

POSIX ¿¡¼­´Â Á¶±Ý ´Ù¸¨´Ï´Ù. È£ÃâÀÚ¿¡ ¸ÅĪÇÔ¼ö°¡ ä¿ï, °íÁ¤±æÀÌÀÇ ¹è¿­À» ³Ñ°Ü
Áà¾ß ÇÕ´Ï´Ù. µû¶ó¼­ regs_allocated °¡ REGS_FIXED ¶ó¸é, ¸ÅĪÇÔ¼ö´Â ±× °íÁ¤¹è
¿­À» °£´ÜÇÏ°Ô Ã¤¿ó´Ï´Ù.

¾Æ·¡ÀÇ ¿¹Á¦´Â re_registers ±¸Á¶Ã¼¿¡ ±â·ÏµÇ´Â Á¤º¸¸¦ º¸¿©ÁÝ´Ï´Ù. ('(' ¿Í ')'
ÀÌ ±×·ì¿ÀÆÛ·¹ÀÌÅͶó°í ÇÏ°í, ¹®ÀÚ¿­ string ¿¡¼­ ù¹ø° ¹®ÀÚÀÇ À妽º¸¦ 0À̶ó
ÇÏ°Ú½À´Ï´Ù.)


¤¡. Á¤±ÔÇ¥Çö½ÄÀÌ ¶Ç´Ù¸¥ ±×·ìÀ» Æ÷ÇÔÇÏÁö ¾Ê´Â, i¹ø° ±×·ìÀ» °¡Áö°í ÀÖ´Ù¸é, ÇÔ
    ¼ö´Â 'regs->start[i]' ¿¡ ±×·ì°ú ¸ÅĪÇÏ´Â º¸Á¶¹®ÀÚ¿­ÀÇ ½ÃÀÛ À妽º¸¦ ÀúÀå
    ÇÏ°í, 'regs->end[i]' ¿¡´Â º¸Á¶¹®ÀÚ¿­ÀÇ ³¡ À妽º¸¦ ÀúÀåÇÕ´Ï´Ù.
    'regs->start[0]'°ú 'regs->end[0]' ¿¡´Â Àüü ÆÐÅÏ¿¡ ´ëÇÑ Á¤º¸°¡ µé¾î°©´Ï´Ù.

  ¿¹¸¦ µé¸é, 'ab' ¿¡ ´ëÇØ '((a)(b))' ¸¦ ¸ÅĪ½ÃŲ´Ù¸é, ´ÙÀ½ÀÇ °á°ú¸¦ ¾òÀ» °ÍÀÔ
  ´Ï´Ù.

   * 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]'

¤¤. ±×·ìÀÌ ¹Ýº¹¿ÀÆÛ·¹ÀÌÅÍ µîÀ» »ç¿ëÇÏ¿© Çѹøº¸´Ù ´õ ¸¹ÀÌ ¸ÅĪµÈ´Ù¸é, ÇÔ¼ö´Â
    ¸¶Áö¸·À¸·Î ¸ÅĪµÈ ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÕ´Ï´Ù.

  ¿¹¸¦ µé¸é, 'aa' ¿¡ ´ëÇØ '(a)*' ¸¦ ¸ÅĪ½ÃŲ´Ù¸é, ´ÙÀ½ÀÇ °á°ú¸¦ ¾òÀ» °ÍÀÔ´Ï´Ù.

   * 0 in `regs->start[0]' and 2 in `regs->end[0]'
   * 1 in `regs->start[1]' and 2 in `regs->end[1]'

  ¿©±â¿¡¼­ ±×·ì 1 Àº '(a)' ÀÌÁö¸¸, µÚÀÇ '*' ¿ÀÆÛ·¹ÀÌÅÍ·Î ÀÎÇØ 'aa' ¿Í´Â 1¹ø
  ÃÊ°ú ¸ÅĪµÇ¹Ç·Î, ¸¶Áö¸·¿¡ ¸ÅĪµÇ´Â 'a'¿¡ ´ëÇÑ À妽º¸¦ ±â·ÏÇÕ´Ï´Ù.

¤§. i¹ø° ±×·ìÀÌ, ¾î¶² ¼º°øÀûÀÎ ¸ÅĪ¿¡ °ü¿©ÇÏÁö ¾Ê´Â´Ù¸é, ¹Ýº¹¿ÀÆÛ·¹ÀÌÅÍ´Â 0¹ø
  ¹Ýº¹À» Çã¿ëÇÏ°í, ÇÔ¼ö´Â 'regs->start[i]' ¿Í 'regs->end[i]' ¸¦ -1·Î ä¿ó´Ï´Ù.

  ¿¹¸¦ µç´Ù¸é, 'b' ¿¡ ´ëÇØ '(a)*b' ¸¦ ¸ÅĪÇÏ´Â °æ¿ì´Â ´ÙÀ½ÀÇ °á°ú¸¦ ¾òÀ» °Í
  ÀÔ´Ï´Ù.

   * 0 in `regs->start[0]' and 1 in `regs->end[0]'
   * -1 in `regs->start[1]' and -1 in `regs->end[1]'

   ¿©±â¿¡¼­ 1¹ø° ±×·ìÀÎ '(a)' ´Â ¸ÅĪ¿¡ °ü¿©ÇÏÁö ¾Ê±â ¶§¹®¿¡ 'regs->start[1]'
   °ú 'regs->end[1]' Àº -1·Î µË´Ï´Ù.

¤©. i¹ø° ±×·ìÀÌ ±æÀÌ°¡ 0ÀÎ ¹®ÀÚ¿­À» ¸ÅĪÇÑ´Ù¸é, ÇÔ¼ö´Â regs->start[i] ¿Í
  regs->end[i] ¸¦ "±æÀÌ°¡ 0ÀÎ ¹®ÀÚ¿­"ÀÇ À妽º·Î ¼³Á¤ÇÕ´Ï´Ù.

  ¿¹¸¦ µç´Ù¸é, 'b' ¿¡ ´ëÇØ '(a*)b' ¸¦ ¸ÅĪÇÏ´Â °æ¿ì´Â ´ÙÀ½ÀÇ °á°ú¸¦ ¾òÀ» °Í
  ÀÔ´Ï´Ù.

  * 0 in `regs->start[0]' and 1 in `regs->end[0]'
  * 0 in `regs->start[1]' and 0in `regs->end[1]'

  ¿©±â¿¡¼­ '(a*)b' ´Â À§ÀÇ '(a)*b' ¿Í´Â ´Ù¸¨´Ï´Ù. 1¹ø° ±×·ìÀÎ '(a*)' ´Â
  'b' ÀÇ ¾ÕºÎºÐÀÇ ºó ¹®ÀÚ¿­°ú ¸ÅĪÀÌ µÇ¹Ç·Î regs->start[1]°ú regs->end[1] Àº
  µÑ´Ù '0' ÀÌ µË´Ï´Ù.

¤±. i¹ø° ±×·ìÀÌ j¹ø° ±×·ìÀ» Æ÷ÇÔÇÏ°í, j¹ø° ±×·ìÀº i¹ø° ±×·ì¿¡¸¸ Æ÷ÇԵǴÂ
    °æ¿ì, ÇÔ¼ö´Â i¹ø° ±×·ìÀÇ ¸ÅĪÀ» ±â·ÏÇÏ°í, regs->start[j] ¿Í regs->end[j]
    ¿¡´Â j¹ø° ±×·ì°ú ¸¶Áö¸·À¸·Î ¸ÅĪµÈ °Í¿¡ ´ëÇÑ Á¤º¸¸¦ ±â·ÏÇÕ´Ï´Ù.

    Á¶±Ý ÇÞ°¥¸®±â ½¬¿î °æ¿ìÀε¥, ¿¹¸¦ µé¾îº¸Áö¿ä..
    'abb' ¿¡ ´ëÇØ '((a*)b)*'¸¦ ¸ÅĪ½ÃÅ°´Â °æ¿ì¸¦ º¾½Ã´Ù.

    regs->start[0] °ú regs->end[0] Àº ´ç¿¬È÷ Àüü ¹®ÀÚ¿­ÀÇ Á¤º¸¸¦ °¡Áö¹Ç·Î
    0(ù¹ø° ¹®ÀÚ À妽º), 3(½ÃÀÛÀ妽º + ±æÀÌ·Î º¸´Â °ÍÀÌ ÁÁÀ» µí..) ÀÌ
    µË´Ï´Ù.

   1:     ((a*)b)*       abb       : 1¹ø° ±×·ì ù ¸ÅĪ (0, 2)
          ^^^^^^^        ^^
          ((a*)b)*       abb       : 2¹ø° ±×·ì ù ¸ÅĪ (0, 1)
           ^^^           ^

   óÀ½ÀÇ ¸ÅĪ¿¡¼­,  1¹ø° ±×·ìÀº 'ab' ¿Í ¸ÅĪµÇ°í, 2¹ø° ±×·ìÀº 'a'¿Í ¸ÅĪ
   µË´Ï´Ù.

          ^^^^^^^
   2:     ((a*)b)*       abb       : 1¹ø° ±×·ì µÑ° ¸ÅĪ (2, 3)
                 ^         ^

           ^^^
          ((a*)b)*       a b b     : 2¹ø° ±×·ì µÑ° ¸ÅĪ (2, 2)
                 ^          ^ (ºó¹®ÀÚ¿­)

    ¹Ýº¹ ¿ÀÆÛ·¹ÀÌÅÍÀÇ ¿µÇâÀ¸·Î, µÎ¹ø° ¸ÅĪ¿¡¼­, 1¹ø° ±×·ìÀº 'b'¿Í ¸ÅĪµÇ°í,
    2¹ø° ±×·ìÀº ¸¶Áö¸· 'b' ÀÇ ¹Ù·Î ¾ÕÀÇ ºó¹®ÀÚ¿­°ú ¸ÅĪµË´Ï´Ù.

   µû¶ó¼­, À§ÀÇ '¤¤' ±ÔÄ¢ (±×·ìÀÌ ¹Ýº¹¿ÀÆÛ·¹ÀÌÅÍ µîÀ» »ç¿ëÇÏ¿© Çѹøº¸´Ù ´õ ¸¹
   ÀÌ ¸ÅĪµÈ´Ù¸é, ÇÔ¼ö´Â ¸¶Áö¸·À¸·Î ¸ÅĪµÈ ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÑ´Ù.) ¿¡ µû
   ¶ó, regs->start[1], regs->end[1] ¿¡´Â 2, 3 ÀÌ °¢°¢ ±â·ÏµÇ¸ç, ±×·ì1Àº ±×·ì
   2¸¦ Æ÷ÇÔÇÏ°í ±×·ì2´Â ±×·ì1¿¡¸¸ Æ÷ÇԵDZ⠶§¹®¿¡, ¸¶Áö¸·À¸·Î ¸ÅĪµÈ 2¹ø° ±×
   ·ìÀÇ ±â·Ï°ªÀÎ 2, 2°¡ °¢°¢ regs->start[2] ¿Í regs->end[2] ¿¡ °¢°¢ ±â·ÏµË´Ï
   ´Ù.

   °á°ú¸¦ Á¤¸®Çϸé,

   * 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]'

   'abb' ¿¡ ´ëÇØ '((a)*b)*' ¸¦ ¸ÅĪÇÑ´Ù¸é, ±×·ì2(°ýÈ£¾ÈÂÊÀÇ '(a)') ´Â ¸¶Áö¸·
   ¸ÅĪ¿¡ °ü¿©ÇÏÁö ¾ÊÀ¸¹Ç·Î ´ÙÀ½°ú °°Àº °á°ú¸¦ ¾ò½À´Ï´Ù.

   * 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]'

   Á¶±Ý ÇÞ°¥¸®´Â ºÐµµ °è½Ç °ÍÀÌ°í, Àç¹Ì¸¦ ´À³¢´Â ºÐµµ °è½Ç °ÍÀÔ´Ï´Ù. :)

¤². À§¿Í °°À» °æ¿ì¿¡, ¸ÅĪÀÌ µÇÁö ¾ÊÀ» °æ¿ì, ÇÔ¼ö´Â regs->start[i],
    regs->end[i]¿Í regs->start[j], regs->end[j] ¸¦ ¸ðµÎ -1 ·Î ¼³Á¤ÇÕ´Ï´Ù.

    ¿¹¸¦ µé¸é, 'c' ¿¡ ´ëÇØ '((a)*b)*c' ¸¦ ¸ÅĪÇÑ´Ù¸é, ´ÙÀ½ÀÇ °á°ú¸¦ ¾òÀ» °Í
    ÀÔ´Ï´Ù.

    * 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]'

·¹Áö½ºÅÍ¿¡ ´ëÇÑ À̾߱â´Â ÀÌ°É·Î ¸¶Ä¡°Ú½À´Ï´Ù.

6.3.9 GNU ÆÐÅϹöÆÛ¸¦ free Çϱâ
-------------------------------

ÆÐÅϹöÆÛ¿¡¼­ ÇÒ´çµÈ Çʵ带 free Çϱâ À§Çؼ­´Â ÀÌÀü¿¡ ¼³¸íµå¸° POSIX ÇÔ¼ö
(6.2.6 ÀÇ regfree) ¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. POSIX ¿¡¼­ »ç¿ëÇÏ´Â regex_t ´Â
GNU ÀÇ re_pattern_buffer ¿Í µ¿ÀÏÇÕ´Ï´Ù. ÆÐÅϹöÆÛ¸¦ free ÇÑ ÀÌÈÄ¿¡´Â, ¾î¶²
°Ë»ö°ú ¸ÅĪÀÛ¾÷À» ´Ù½Ã ¼öÇàÇÏ·Á¸é, Á¤±ÔÇ¥Çö½ÄÀ» ÆÐÅϹöÆÛ·Î ´Ù½Ã ÄÄÆÄÀÏÇÏ¿©
¾ß ÇÕ´Ï´Ù.
ÃßõÃßõ : 254 Ãßõ ¸ñ·Ï
¹øÈ£ Á¦¸ñ
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.