亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 編程設(shè)計 > 正文

在C/C++語言中使用正則表達式

2020-07-14 13:42:44
字體:
供稿:網(wǎng)友

  本文所有的內(nèi)容都來自網(wǎng)絡(luò),加上一些個人的理解,不保證正確性,歡迎批評指正
  說起正則表達式(Regular Expression),也許有的朋友天天都在使用,比如grep、vim、sed、awk,只是可能對這個名詞不大熟悉。正則表達式一般簡寫為regex或者regexp,甚至是RE。關(guān)于正則表達式的介紹,有很多的文章,用搜索引擎查找就可以找到很不錯的使用說明。但是在C/C++語言中如何去使用,相應(yīng)的介紹比較缺乏。大多數(shù)C標(biāo)準(zhǔn)庫自帶regex,可以通過/usr/include/regex.h去看,或者man regex看使用說明。perl,php等語言更是提供了功能強大的正則表達式,最著名的C語言正則表達式庫為PCRE(Perl Compatible Regular Expression)。本文主要對regex和pcre的使用做一點入門介紹。
  1、regex
  regex的使用非常簡單,只要看一下示例代碼1就能明白(示例代碼是從“GNU C 規(guī)則表達式入門”這篇文章里摘取出來的,是否為原始出處就
  不得而知了)。
  CODE:#include <stdio.h>
  #include <string.h>
  #include <regex.h>
  #define SUBSLEN 10              /* 匹配子串的數(shù)量 */
  #define EBUFLEN 128          /* 錯誤消息buffer長度 */
  #define BUFLEN 1024          /* 匹配到的字符串buffer長度 */
  int main()
  {
  size_t       len;
  regex_t       re;      /* 存儲編譯好的正則表達式,正則表達式在使用之前要經(jīng)過編譯 */
  regmatch_t    subs [SUBSLEN]; /* 存儲匹配到的字符串位置 */
  char          matched [BUFLEN];     /* 存儲匹配到的字符串 */
  char          errbuf [EBUFLEN]; /* 存儲錯誤消息 */
  int          err, i;
  char          src    [] = "111 <title>Hello World</title> 222"; /* 源字符串 */
  char          pattern [] = "<title>(.*)</title>"; /* pattern字符串 */
  printf("String : %s/n", src);
  printf("Pattern: /"%s/"/n", pattern);
  /* 編譯正則表達式 */
  err = regcomp(&re, pattern, REG_EXTENDED);
  if (err) {
  len = regerror(err, &re, errbuf, sizeof(errbuf));
  printf("error: regcomp: %s/n", errbuf);
  return 1;
  }
  printf("Total has subexpression: %d/n", re.re_nsub);
  /* 執(zhí)行模式匹配 */
  err = regexec(&re, src, (size_t) SUBSLEN, subs, 0);
  if (err == REG_NOMATCH) { /* 沒有匹配成功 */
  printf("Sorry, no match .../n");
  regfree(&re);
  return 0;
  } else if (err) {   /* 其它錯誤 */
  len = regerror(err, &re, errbuf, sizeof(errbuf));
  printf("error: regexec: %s/n", errbuf);
  return 1;
  }
  /* 如果不是REG_NOMATCH并且沒有其它錯誤,則模式匹配上 */
  printf("/nOK, has matched .../n/n");
  for (i = 0; i <= re.re_nsub; i++) {
  len = subs[i].rm_eo - subs[i].rm_so;
  if (i == 0) {
  printf ("begin: %d, len = %d   ", subs[i].rm_so, len); /* 注釋1 */
  } else {
  printf("subexpression %d begin: %d, len = %d   ", i, subs[i].rm_so, len);
  }
  memcpy (matched, src + subs[i].rm_so, len);
  matched[len] = '/0';
  printf("match: %s/n", matched);
  }
  regfree(&re); /* 用完了別忘了釋放 */
  return (0);
  }
  執(zhí)行結(jié)果是
  CODE:String : 111 <title>Hello World</title> 222
  Pattern: "<title>(.*)</title>"
  Total has subexpression: 1
  OK, has matched ...
  begin: %, len = 4   match: <title>Hello World</title>
  subexpression 1 begin: 11, len = 11   match: Hello World
  從示例程序可以看出,使用之前先用regcomp()編譯一下,然后調(diào)用regexec()進行實際匹配。如果只是看有沒有匹配成功,掌握這2個函數(shù)的用法即可。有時候我們想要取得匹配后的子表達式,比如示例中想獲得title是什么,需要用小括號 "( )"把子表達式括起來"<title>(.*)</title>",表達式引擎會將小括號 "( )" 包含的表達式所匹配到的字符串記錄下來。在獲取匹配結(jié)果的時候,小括號包含的表達式所匹配到
  的字符串可以單獨獲取,示例程序就是我用來獲取http網(wǎng)頁的主題(title)的方式。
  regmatch_t subs[SUBSLEN]是用來存放匹配位置的,subs[0]里存放這個匹配的字符串位置,subs[1]里存放第一個子表達式的匹配位置,也就是例子中的title,通過結(jié)構(gòu)里的rm_so和rm_eo可以取到,這一點很多人不太注意,應(yīng)該強調(diào)一下。
  注釋1:開始調(diào)試代碼的時候是在FreeBSD 6.2上進行的,print出來的len總是0,但print出來的字符串又沒錯,很是迷惑,把它放到Linux上則完全正常,后來仔細檢查才發(fā)現(xiàn)rm_so在Linux上是32位,在FreeBSD上是64位,用%d的話實際取的是rm_so的高32位,而不是實際的len,把print rm_so的地方改為%llu就可以了。
  regex雖然簡單易用,但對正則表達式的支持不夠強大,中文處理也有問題,于是引出了下面要說的PCRE。
  2、PCRE   (http://www.pcre.org)
  PCRE的名字就說明了是Perl Compatible,熟悉Perl、PHP的人使用起來完全沒有問題。PCRE有非常豐富的使用說明和示例代碼(看看
  pcredemo.c就能明白基本的用法),下面的程序只是把上面regex改為pcre。
  CODE:/* Compile thuswise:
  * gcc -Wall pcre1.c -I/usr/local/include -L/usr/local/lib -R/usr/local/lib -lpcre
  *
  */
  #include <stdio.h>
  #include <string.h>
  #include <pcre.h>
  #define OVECCOUNT 30 /* should be a multiple of 3 */
  #define EBUFLEN 128
  #define BUFLEN 1024
  int main()
  {
  pcre          *re;
  const char    *error;
  int          erroffset;
  int          ovector[OVECCOUNT];
  int          rc, i;
  char          src [] = "111 <title>Hello World</title> 222";
  char          pattern [] = "<title>(.*)</title>";
  printf("String : %s/n", src);
  printf("Pattern: /"%s/"/n", pattern);
  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
  if (re == NULL) {
  printf("PCRE compilation failed at offset %d: %s/n", erroffset, error);
  return 1;
  }
  rc = pcre_exec(re, NULL, src, strlen(src), 0, 0, ovector, OVECCOUNT);
  if (rc < 0) {
  if (rc == PCRE_ERROR_NOMATCH) printf("Sorry, no match .../n");
  else printf("Matching error %d/n", rc);
  free(re);
  return 1;
  }
  printf("/nOK, has matched .../n/n");
  for (i = 0; i < rc; i++) {
  char *substring_start = src + ovector[2*i];
  int substring_length = ovector[2*i+1] - ovector[2*i];
  printf("%2d: %.*s/n", i, substring_length, substring_start);
  }
  free(re);
  return 0;
  }
  執(zhí)行結(jié)果是:
  CODE:String : 111 <title>Hello World</title> 222
  Pattern: "<title>(.*)</title>"
  OK, has matched ...
  0: <title>Hello World</title>
  1: Hello World
  比較這2個例子可以看出,在regex用的是regcomp()、regexec(),pcre則使用pcre_compile()、pcre_exec(),用法幾乎完全一致。
  pcre_compile()有很多選項,詳細說明參見http://www.pcre.org/pcre.txt。如果是多行文本,可以設(shè)置PCRE_DOTALL的選項pcre_complie(re,
  PCRE_DOTALL,....),表示'.'也匹配回車換行"/r/n"。
  3、pcre++
  pcre++(http://www.daemon.de/PCRE)對pcre做了c++封裝,使用起來更加方便。
  CODE:/*
  * g++ pcre2.cpp -I/usr/local/include -L/usr/local/lib -R/usr/local/lib -lpcre++ -lpcre
  */
  #include <string>
  #include <iostream>
  #include <pcre++.h>
  using namespace std;
  using namespace pcrepp;
  int main()
  {
  string src("111 <title>Hello World</title> 222");
  string pattern("<title>(.*)</title>");
  cout << "String : " << src << endl;
  cout << "Pattern : " << pattern << endl;
  Pcre reg(pattern, PCRE_DOTALL);
  if (reg.search(src) == true) { //
  cout << "/nOK, has matched .../n/n";
  for(int pos = 0; pos < reg.matches(); pos++) {
  cout << pos << ": " << reg[pos] << endl;
  }
  } else {
  cout << "Sorry, no match .../n";
  return 1;
  }
  return 0;
  }
  執(zhí)行結(jié)果是:
  CODE:String : 111 <title>Hello World</title> 222
  Pattern : <title>(.*)</title>
  OK, has matched ...
  0: Hello World
  4、oniguruma
  還有一個正則表達式的庫oniguruma(http://www.geocities.jp/kosako3/oniguruma/),對于東亞文字支持比較好,開始是用在ruby上,也可用于C++,是日本的開發(fā)人員編寫的。大多數(shù)人都不會用到,也就不做介紹了。如果有疑問可以通過email來討論它的用法。
  5、Regular Expression的內(nèi)部實現(xiàn)
  關(guān)于Regular Expression的實現(xiàn),用到了不少自動機理論(Automata Theory)的知識,有興趣的可以找這方面的資料來看,這本書“
  Introduction to Automata Theory, Languages, and Computation”寫的很好,編譯原理的書也有這方面的內(nèi)容。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产精品国产自产拍高清av| 日本三级免费观看| 国产在成人精品线拍偷自揄拍| 亚洲一级不卡视频| 成人自拍视频在线观看| 中文字幕久精品免费视频| 国产免费无码一区二区视频| 天天影视久久综合| 999国产精品永久免费视频app| 日本欧美一区二区三区| 国产又粗又大又黄| 亚洲成熟丰满熟妇高潮xxxxx| 日韩欧美一区二区三区| 69夜色精品国产69乱| 99久久国产综合精品五月天喷水| 欧美性在线观看| 欧美日韩免费高清一区色橹橹| 亚洲午夜一级| www.国产高清| 丝袜久久网站| 亚洲午夜未删减在线观看| 国产一区视频导航| 二区三区精品| 免费观看av网站| 国产午夜在线播放| 国产美女精品视频免费播放软件| 久久久一本精品99久久精品| 久久精品电影一区二区| 成年人视频免费| 亚洲视频分类| 国产精品久久久久久久电影| 欧美体内she精视频在线观看| 一卡二卡3卡四卡高清精品视频| 男女午夜网站| 国产老妇另类xxxxx| 国产永久精品大片wwwapp| 日韩高清在线观看一区二区| 国产人妻一区二区| 精品av久久707| 香蕉网在线播放| 国产日韩欧美精品一区| 国产精品亚洲专一区二区三区| 欧美私模裸体表演在线观看| 亚洲精品91美女久久久久久久| 丰满少妇乱子伦精品看片| 成人在线观看黄色| 成人18夜夜网深夜福利网| 亚洲精品第一国产综合精品| 九九精品在线播放| 亚洲+变态+欧美+另类+精品| 色视频线观看在线播放| 欧美精品久久| av免费在线观看网址| 欧美久久综合性欧美| 完整版免费av片| 亚洲美女精品久久| 欧美午夜丰满在线18影院| 秋霞在线观看一区二区三区| 手机免费av片| 中文字幕亚洲一区二区va在线| 日韩欧美国产精品综合嫩v| 欧美人妻一区二区三区| 欧美专区在线观看一区| 色狠狠桃花综合| 91精品国产欧美一区二区| 免费久久久一本精品久久区| 国产精品福利视频| 成人四虎影院| 欧美成人中文| 中国a一片一级一片| 国产成人精品在线观看| 国产毛片毛片毛片毛片毛片| 中文字幕免费在线观看视频| 中文字幕亚洲图片| 91美女片黄在线观看91美女| 亚洲一区二区三区av无码| 伊人国产在线视频| 国产精品一区二区你懂的| 国产精品一品二区三区的使用体验| 国产麻豆乱码精品一区二区三区| 日韩有码电影| 极品美女销魂一区二区三区| 在线观看日韩高清av| 亚洲欧美久久婷婷爱综合一区天堂| 人妻少妇精品视频一区二区三区| 福利精品视频在线| 欧美一区二区三区红桃小说| 欧美午夜一区二区福利视频| 欧美性感一类影片在线播放| 国产suv精品一区| 免费久久久一本精品久久区| 日韩av综合网站| 免费拍拍拍网站| 中文字幕第8页| 91精品国产色综合久久| 国产精品男人爽免费视频1| 毛片av在线播放| 中国免费黄视频| 秋霞电影一区二区| 久久夜色撩人精品| 日本一本不卡| 一呦二呦三呦国产精品| 国产精品黄色在线观看| 国产精品7777| 中文字幕第一区综合| 日本一区二区精品视频| 9l视频白拍9色9l视频| 日韩视频www| 成人影视亚洲图片在线| 激情伊人五月天| 日韩成人动漫在线观看| 免费精品99久久国产综合精品应用| 中文字幕一区二区人妻| 8090成年在线看片午夜| 欧美日韩一区二区三区视频| 国产精品99免费看| 亚洲影音先锋| 久久久久久久电影| 国产精品 欧美精品| 亚洲综合极品香蕉久久网| 久热国产在线视频| 女人十八毛片嫩草av| 国产精品白浆视频免费观看| 婷婷夜色潮精品综合在线| 国产男男chinese网站| 欧美日韩一区二区区| 国内精久久久久久久久久人| 亚洲成人精品女人久久久| av一区二区三| 成人激情久久| 四虎激情影院| 国产精品三级在线观看无码| 一卡二卡三卡视频| 国产精品毛片一区二区在线看舒淇| 日韩丝袜情趣美女图片| 性久久久久久久久久久| 免费亚洲精品视频| av电影在线观| 中文字幕精品—区二区日日骚| 色视频免费观看| 久久77777| 国产精品久久久久久久免费软件| 欧美高清在线视频| 欧美亚洲伦理www| 日本欧美肥老太交大片| 免费人成年激情视频在线观看| 中文字幕免费在线观看| 97人洗澡人人免费公开视频碰碰碰| 国产无套精品一区二区| 国模吧一区二区三区| 国产精品一区视频| 日韩国产欧美在线播放| 激情欧美国产欧美| 日韩色妇久久av| 欧美在线关看| 涩涩漫画在线观看| 无套内谢的新婚少妇国语播放| 国产福利一区二区三区视频| 精品中文字幕久久久久久| 福利一区二区免费视频| 久久综合伊人77777麻豆最新章节| 久久成人资源| 日韩欧美国产成人精品免费| 欧美人体做爰大胆视频| 亚洲一区自拍偷拍| 色综合咪咪久久| 日韩欧美在线免费观看视频| 国产午夜精品福利| 久久久青草婷婷精品综合日韩| 亚洲av成人精品一区二区三区在线播放| 欧美激情高清视频| xxxxx性欧美特大| 丝袜综合欧美| 欧美在线播放视频| 青青草综合网| 色综合久久久无码中文字幕波多| 国产成人艳妇aa视频在线| 久久精品aaaaaa毛片| 精品国产1区二区| 亚洲一区二区免费在线观看| 精品成人私密视频| 一区二区三区www污污污网站| 3d动漫精品啪啪一区二区三区免费| 日韩av福利在线观看| 欧美最猛性xxxxxhd| 日韩亚洲欧美一区| 国产伦精品一区二区三区在线| 伊人久久综合97精品| 黄色国产小视频| 中文字幕在线视频区| 成人短视频软件网站大全app| 久久久久88色偷偷| 蜜桃传媒一区二区| 国产一区二区三区不卡在线观看| 91美女蜜桃在线| 欧美人与性动交α欧美精品| 亚洲精品不卡在线| 欧美人与性禽动交精品| 国产精品传媒麻豆hd| 欧美成人免费全部| 国产成人精品午夜视频免费| 国产欧美综合一区二区三区| 色中色一区二区| 亚洲一级网站| 精品国产乱码久久久久久久久| 秋霞网一区二区三区| 麻豆精品国产91久久久久久| av在线播放一区二区三区| 中文字幕在线播放网址| 亚洲综合不卡| 亚洲国产精品va| 亚洲成色www久久网站| 国产999精品久久| 国产精品嫩草69影院| 尤物yw午夜国产精品视频| 粉嫩一区二区三区在线观看| 四虎免费在线观看| 亚洲免费在线观看| 亚洲欧美日韩高清在线| 中文字幕av在线播放| 成人免费视频77777| 人妻一区二区视频| 激情综合久久| 国产精品福利在线播放| 西野翔中文久久精品字幕| h视频免费在线观看| 日韩精品成人一区二区三区| xvideos成人免费中文版| 欧美videos大乳护士334| 97最新国自产拍视频在线完整在线看| 久久久久久久久黄色| www.亚洲一区二区| 欧美色欧美亚洲高清在线视频| 亚洲综合一二三区| 亚洲妇女av| 黄色网页在线| 欧美一区二区三区电影在线观看| 综合欧美一区二区三区| 污视频网站在线播放| 欧美日韩高清在线| 成人免费一区二区三区| 午夜精品福利在线| 无码av免费一区二区三区试看| 国产乱码精品一区二区三区不卡| 中日韩高清电影网| 亚洲第五色综合网| 色系网站成人免费| 欧美主播一区二区三区| 老司机精品视频导航| 久久99久久99小草精品免视看| 美女把腿扒开让男人桶免费| 在线播放色视频| 久草在线免费二| 亚洲国产精品久久久久秋霞影院| 精品国模在线视频| 日本精品人妻无码77777| 欧美性色综合| 在线看国产精品| 欧美日韩国产一区二区三区地区| 日韩av在线网页| 91亚洲精品视频| 综合区小说区图片区在线一区| 欧美一卡2卡3卡4卡无卡免费观看水多多| 亚洲男女性事视频| 亚洲国产电影| 国产精品美女久久久久高潮| 五月天激情婷婷| 91精彩视频| 亚洲综合在线网| 亚洲精品天堂成人片av在线播放| 精品欧美在线观看| 国产在线拍揄自揄拍无码| 久久综合桃花网| 91中文在线视频| 欧美一区二区精品| 看黄色免费网站| 偷拍一区二区三区四区| 亚洲一区bb| 亚洲欧洲一二区| av成人综合| 暖暖在线中文免费日本| 亚洲色图在线看| 欧美高清在线一区二区| 日韩毛片在线看| 特级西西人体4444xxxx| 男女男精品视频网| 国产精品传媒麻豆hd| 日本网址在线观看| 免费一级欧美片在线观看| 亚洲一二三精品| 免费的很黄很污的视频网站| 绿色成人影院| 国产熟女一区二区丰满| 欧美国产日产图区| 天堂网av2018| 在线免费观看中文字幕| 成人精品视频久久久久| 久草香蕉在线| 人人干人人干人人干| 91精品国模一区二区三区| 在线播放av片| 国产熟妇一区二区三区四区| v888av成人| 亚洲国产成人在线视频| 四季久久免费一区二区三区四区| 五月婷婷色丁香| 日韩a级在线观看| 国产91在线播放精品91| 亚洲网站三级| 午夜免费一级片| 亚洲天堂自拍偷拍| 91在线|亚洲| 九色视频在线观看免费播放| 国产成人在线视频免费观看| 中文字幕精品国产| 一区二区三区欧美亚洲| 色资源网在线观看| 蜜桃在线一区二区| 欧美1区2区3区4区| 天天操夜夜摸| 人妻精品一区二区三区| 成人写真福利网| 免费久久网站| 黄色成人免费观看| 久一视频在线观看| 久久国产黄色片| 久久99精品国产.久久久久| 99久久99久久精品国产片|