PCRECPP : C++¿ë Á¤±ÔÇ¥Çö ¶óÀ̺귯¸®
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>C++>pcrecpp



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

PCRE

perlÀº ´Ù¸¥ ¾ð¾î¿¡¼­´Â ã¾Æº¸±â Èûµç ¸Å¿ì °­·ÂÇÑ Á¤±ÔÇ¥Çö½ÄÀ» Á¦°øÇÑ´Ù. ¹°·Ð PHP¿Í Pythonµµ Á¤±ÔÇ¥Çö½ÄÀ» Á¦°øÇϱä ÇÏÁö¸¸, perl¿¡¼­ÀÇ Á¤±ÔÇ¥Çö½ÄÀÌ ¿ª»çµµ ¿À·¡µÇ¾ú°í °ÅÀÇ Ç¥ÁØÀÌ´Ù º¸´Ï °í¹«½Å¿¡ ¾çº¹À» ÀÔÈù ´À³¦À̶ö±î ±×·± ´À³¦ÀÌ µå´Â °æ¿ì°¡ ÀÖ´Ù. ±×·¡¼­ Á¤±ÔÇ¥Çö½ÄÀ» ÀÌ¿ëÇØ¾ß ÇÒ °æ¿ì¿¡´Â ¿©ÀüÈ÷ PerlÀ» »ç¿ëÇÑ´Ù.

C/C++Àº ¾î¶±ÇØ¾ß Çϳª. Áַ¾ð¾î°¡ C/C++ÀÌ´Ù º¸´Ï, C¾ð¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Â Á¤±ÔÇ¥Çöµµ±¸°¡ ÀÖÀ¸¸é ÇÏ´Â°Ô ¹Ù·¥À̾ú´Ù. regex°¡ ÀÖ±ä ÇÏÁö¸¸, PerlÀÇ °­·ÂÇÔ¿¡ ºñÇÏ¸é »ç¿ëÇϱⰡ ¿©°£ ºÒÆíÇÑ°Ô ¾Æ´Ï´Ù. ƯÈ÷ perlÀÇ Ä¡È¯ ´É·ÂÀ» »ý°¢Çϸé..

±×·¯´Ù°¡ ±¸±Û½Å¿¡ ¹°¾î¹°¾î PCRE¶ó´Â Á¤±ÔÇ¥Çö ¶óÀ̺귯¸®¸¦ ã°Ô µÇ¾ú´Ù. ¹«·Á Perl Compatible Regular ExpressionsÀ̶õ´Ù. ³»°¡ ¿øÇÏ´Â°Ô ÀÌ°Í ¾Æ´Ò±î ¶ó´Â »ý°¢ÀÌ µé¾ú´Ù. ¾Ë¾Æ ºÃ´õ´Ï Apache, PHP, KDE, Postfix, Nmap, Analogµî ÀÌ¹Ì ¸¹Àº ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Â ¶óÀ̺귯¸® ¿´´Ù. ³ª¸¸ ¸ð¸£°í ÀÖ¾ú±º T.T

PCRECPP

PCRECPP´Â PCREÀÇ C++ wrapper ÇÔ¼ö·Î ±¸±Û¿¡¼­ Á¦°øÇÑ´Ù. ¾î´À ¶óÀ̺귯¸®¸¦ »ç¿ëÇØµµ °ü°è ¾ø°ÚÀ¸³ª. wrapperÀÎ ¸¸Å­ ġȯµî Á» ´õ ±¤¹üÀ§ÇÑ ±â´ÉÀ» Áö¿øÇϰí À־ PCRECPP¸¦ Á¤±ÔÇ¥Çö/ġȯ ¶óÀ̺귯¸®·Î »ç¿ëÇϱâ·Î Çß´Ù.

Âü°í·Î ÀÌ ¶óÀ̺귯¸®´Â »ç¿ë¹æ¹ýÀ» ÀÍÈ÷´Â°Ô Áß¿äÇÑ°Ô ¾Æ´Ù. ÆÞ Á¤±ÔÇ¥ÇöÀ» ÀÍÈ÷´Â°Ô Áß¿äÇÏ´Ù.

¼³Ä¡

¿ìºÐÅõ ¸®´ª½º¿¡¼­ ÆÐŰÁö °ü¸®ÀÚ·Î °£´ÜÇÏ°Ô ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù.
# sudo apt-get install libpcre++0  
# sudo apt-get install libpcre++-dev 
 

ÀÎŬ·çµå

#include <pcrecpp.h> 
 

ÄÄÆÄÀÏ

# g++ -o pcrecpptest pcrecpptest.cc -lpcrecpp 
 

Ç® ¸ÅĪ

FullMatch´Â ÆÐÅÏÀÌ ¹®ÀÚ¿­°ú Á¤È®È÷ ÀÏÄ¡ÇÏ´ÂÁö¸¦ È®ÀÎÇÑ´Ù.
// ¿ÏÀü ÀÏÄ¡ ÇϹǷΠ1À» ¹ÝȯÇÑ´Ù. 
pcrecpp::RE re("h.*o"); 
cout << re.FullMatch("hello") << endl; 
 
// ºÎºÐ ÀÏÄ¡ÇϹǷΠ0À» ¹ÝȯÇÑ´Ù. 
pcrecpp::RE re("e"); 
cout << re.FullMatch("hello") << endl; 
 
¹®ÀÚ¿­Àº const char *¿Í string ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¸ÅĪµÈ ¹®ÀÚ¿­À» µû·Î ÀúÀåÇÒ ¼öµµ ÀÖ´Ù. ¹®ÀÚ¿­ "ruby:1234"ÀÌ ÀÖ°í, ruby¿Í 1234¸¦ µû·Î ÀúÀåÇÏ±æ ¿øÇÑ´Ù¸é, ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù. ÀÌ°É regex³ª Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ¼­ ÀÛ¾÷ÇÒ °ÍÀ» »ý°¢Çغ¸¸é, ²Ï³ª ²ûÂïÇÒ °Í °°´Ù.
int i; 
string s; 
pcrecpp::RE re("(\\w+):(\\d+)"); 
re.FullMatch("ruby:1234", &s, &i); 
cout << s << " " << i << endl; 
 

ºÎºÐ ¸ÅĪ

ºÎºÐÀÏÄ¡¸¦ ã±â ¿øÇÑ´Ù¸é PartialMatch¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù.
cout << pcrecpp::RE("ell").PartialMatch("hello") << endl; 
 

óÀ½ ÀÏÄ¡ÇÏ´Â ¼ýÀÚ¸¦ °¡Á®¿À´Â ¿¹Á¦
int number; 
pcrecpp::RE re("(\\d+)"); 
re.PartialMatch("x * 100 + 20", &number); 
assert(number == 100); 
cout << number << endl; 
 

Á¤±ÔÇ¥Çö½Ä ±ÔÄ¢ ¼öÁ¤

Perl Á¤±ÔÇ¥Çö½ÄÀ» º¸¸é ¿£Áø ±ÔÄ¢À» ¼öÁ¤Çϱâ À§ÇÑ ¿©·¯°¡Áö ±ÔÄ¢µéÀ» Á¦°øÇÑ´Ù. PCRECPP´Â RE_OptionsÀ» ÀÌ¿ëÇØ¼­ ÀÌ·¯ÇÑ ÀϵéÀ» ÇÒ ¼ö ÀÖ´Ù. °³ÀÎÀûÀ¸·Î caseless¸¦ °¡Àå ¸¹ÀÌ ¾´´Ù.
modifier description Perl¿¡ ´ëÀÀÇÏ´Â ¿É¼Ç
RCRE_CASELESS ´ë¼Ò¹®ÀÚ ¹«½Ã /i
PCRE_MULTILINE ¸ÖƼ¶óÀÎ ¸ÅĪ /m
PCRE_DOTALL dot matches newlines /s
PCRE_DOLLAR_ENDONLY $´Â ¸¶Áö¸· ¸ÅÄ¡¿¡¸¸ »ç¿ëµÊ
PCRE_UTF8 UTF8 ¹®ÀÚ Á¦¾î ±âº» ³»Àå
PCRE_EXTRA strict escape parsing
PCRE_EXTENDED whitespace ¹®ÀÚ ¹«½Ã /x

´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
RE_options opt; 
opt.set_caseless(true); 
if (RE("HELLO", opt).PartialMatch("hello world"))  
 
RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); 
 

Scanning Text Incrementally

Consume ¿¬»êÀº ¹®¼­¸¦ ¾ÕÀ¸·Î ÀÐÀ¸¸é¼­ ¹Ýº¹ÀûÀ¸·Î ÆÐÅϸÅĪÀ» Àû¿ëÇϰíÀÚ ÇÒ¶§ À¯¿ëÇÏ´Ù. ¿¹¸¦µé¾î ´ÙÀ½°ú °°Àº ¼³Á¤ÆÄÀÏÀ» ÀÐÀ» ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
Key1=value1 
Key2=value2 
Key3=value3 
... 
 

ÀÀ¿ë ¿¹
string var; 
int value; 
 
string contents="year=1985\nage=25\nbuy=1000\nnation=1022\n"; 
pcrecpp::StringPiece input(contents); 
pcrecpp::RE re("(\\w+)=(\\d+)\n"); 
 
while(re.Consume(&input, &var, &value)) 
{ 
    cout << var << " : " << value << endl; 
} 
 

¹®ÀÚ¿­ ġȯ

¹®ÀÚ¿­ ġȯ ±â´Éµµ Á¦°øÇÑ´Ù. ¹°·Ð Áö±Ý±îÁöÀÇ ÇÔ¼öµé¸¸À¸·Îµµ °¡´ÉÇϱä ÇÏÁö¸¸, ±¸ÇöÇÒ·Á¸é ¿©°£ ±ÍÂúÁö ½Í´Ù.
string s = "yabba dabba doo"; 
cout << "Result " << pcrecpp::RE("b+").Replace("d", &s) << endl; 
cout << s << endl; 
 
°£´ÜÇØ¼­ ÁÁ´Ù. Replace´Â óÀ½ ¸ÅĪµÈ ÆÐÅϸ¸À» ġȯÇÑ´Ù. ¸ðµç ÆÐÅÏ¿¡ ´ëÇØ¼­ ÀÏÄ¡ÇÒ·Á¸é GlobalReplace¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. perlÀÇ "\g"¿Í ºñ½ÁÇÑ ÀÏÀ» ÇÑ´Ù.

string s = "yabba dabba doo"; 
cout << "Result " << pcrecpp::RE("b+").GlobalReplace("d", &s) << endl; 
cout << s << endl; 
 

¿¹Á¦

HTML ¹®¼­¿¡¼­ joinc.co.kr·Î °¡´Â ¸µÅ©¸¦ my.co.kr/redirect/joinc.co.kr·Î ġȯÇÑ´Ù.
#include <pcrecpp.h> 
#include <string.h> 
#include <stdio.h> 
 
#include <iostream> 
 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
 
using namespace std; 
#define READ_LINE 32  
#define MAX_BUF READ_LINE * 2  
 
int main(int argc, char **argv) 
{ 
    int fd=0; 
    char buf[MAX_BUF]; 
    string s; 
 
    string redirect = "http://my.co.kr/redirect/"; 
    string replace_rule = "\\1=\\2"+redirect+"\\3\\4"; 
    pcrecpp::RE_Options opt; 
    opt.set_caseless(true); 
 
    fd = open("test.html", O_RDONLY); 
    memset(buf, 0x00, MAX_BUF); 
    while(read(fd, buf, READ_LINE) > 0) 
    { 
        s = buf; 
        pcrecpp::RE("(src|href|action|xmlns|url)=([\'\"])*http://([a-zA-Z0-9\\-\\_\\.]*)(joinc\\.co\\.kr)",opt).GlobalReplace(replace_rule,&s); 
        cout << s; 
        memset(buf, 0x00, MAX_BUF); 
    } 
} 
 

¾à°£ÀÇ ¹®Á¦

ÆÐÅÏÀ» °Ë»öÇÒ ¶§¿¡´Â ÇöÀç ¹öÆÛÀÇ ³»¿ë¸¸À» °Ë»öÇÑ´Ù. À§ ÇÁ·Î±×·¥À» ¿¹·Î µéÀÚ¸é ´ÙÀ½°ú °°Àº °æ¿ì ÆÐÅÏÀ» ÀÏÄ¡ÇÏÁö ¸øÇÑ´Ù. ¹öÆÛ¸¦ ÀÛ°Ô ÇÒ °æ¿ì ÇÏÇÊ ¿î³ª»Ú°Ô ÆÐÅÏÀÌ ÀÏÄ¡ÇØ¾ßÇÒ ºÎºÐÀÌ Â©¸®´Â ¹Ù¶÷¿¡, °Ë»öÀ» ¸øÇÏ´Â °æ¿ì°¡ »ý±æ ¼ö ÀÖ´Ù.
<¹öÆÛ> 
.... 
<a href=http://www.joinc.co. 
</¹öÆÛ> 
 
À̸¦ ÇØ°áÇϱâ À§ÇÑ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
  • µ¥ÀÌÅ͸¦ ¸ðµÎ ÀúÀåÇØ¼­ ÆÐÅϸÅĪÀ» ¼öÇàÇÑ´Ù. °£´ÜÇÑ ¹æ¹ýÀ̱ä Çѵ¥.. ¸Þ¸ð¸® Å©±â ¶§¹®¿¡ ±âºÐÀÌ Á» ÂóÂóÇÏ´Ù.
  • ¹öÆÛ¿¡ È¿°úÀûÀ¸·Î ÀúÀåÇϱâ. ¿¹ÄÁµ¥, À§¿¡¼­ ó·³ URL Rewrite¶ó¸é ">"À» ¸¸³¯ ¶§±îÁö ÀúÀåÀ» ÇØ¼­, ¸ÅĪÇϰíÀÚ ÇÏ´Â ´ë»óÀÌ Áß°£¿¡ ©¸®Áö ¾Êµµ·Ï ÇÑ´Ù. Á» ±ÍÂúÁö ½Í´Ù.

category_TOOL
category__14
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.