boost正規表示式經典例項

2021-05-25 18:57:31 字數 2339 閱讀 5674

什麼是正規表示式?正規表示式是一種用來描述一定數量文字的模式。regex代表regular express.

如果您不知道什麼是正規表示式,請看這篇文章:深入淺出之正規表示式

有了正規表示式的基礎,問題是如何使用。我們以boost::regex來說

先看乙個網上經典的例子。

#include "stdafx.h"

#include

#include

#include

#include

#include

using namespace std;

using namespace boost;

regex expression("^select ([a-za-z]*) from ([a-za-z]*)");

int main(int argc, char* argv)

匹配字元''a''重複n次

a,字元a重複n次以上(含n次)

a a重複n到m次(含)

*?   匹配前乙個原子零次以上

+?   匹配前乙個原子一次以上

??   匹配前乙個原子零次以上

?  匹配前乙個原子n次以上(含)

str是乙個字串,可以是string,wstring,char *或者wchar_t *

m是match_results,它通過引用傳入引數,來儲存匹配的結果,m要和str的型別匹配,可以是smatch,wsmatch,cmatch或wcmatch,用來分別對應string,wstring,char *或者wchar_t*的str.

re就是正規表示式了,一般來說是regex或wregex.

str,m,re的型別如下:

函式的返回值表示字串是否完全匹配正規表示式,當返回true的時候,m儲存了匹配的結果;返回false,m未定義。

下面讓我們來看一下,當函式返回true的時候,m是怎麼樣的。

m.size() == re.mark_count()

其實,這個「組數」在boost的regex中叫做sub-expression.sub-expression就是在正則式中使用小括號括起來的一部分,正則式本身是乙個sub-expression,所以re.mark_count()等於小括號對數+1.

m.prefix()和m.suffix()

這兩個返回的是sub_match型別(相當於乙個迭代器組)。在regex_match演算法中,這兩個返回的sub_match都是空的,他們的值如下:(sub_match繼承於pair,所以有first和second成員哦)

m.prefix()。first == str.begin()

m.prefix()。second == str.begin()

m.prefix()。matched == false

m.suffix()。first == str.end()

m.suffix()。second == str.end()

m.suffix()。matched == false

因為regex_match是完全匹配,即整個字串和正則式匹配,所以字首和字尾都是空的。

m[0]

返回第0個匹配的,由於regex_match是完全匹配,所以

m[0].first == str.begin()

m[0].second == str.end()

m[0].matched == true

m[n] , n返回第n個匹配的sub-expression.

m[n].matched 表示第n個sub-expression是否在字串中存在。整個regex匹配,但是sub_exp可能匹配的是空的,例如「(a*)」就有可以匹配空。

m[n].first和m[n].second 表示匹配的範圍。如果匹配空的話,都為str.end()。

根據我的測試,m[1],m[2],……,m[n]的順序是按照正則式的左小括號的順序來的,例如對於正則式「((a)bc)d(efg)」,如果匹配了乙個字串的話(字串只可能是「abcdefg」),則

m[0] == 「abcdefg」  (sub_match過載了==運算子使得可以和乙個字串比較)

m[1] == 「abc」

m[2] == 「a」

m[3] == 「efg」

regex_match的其它用法

regex_search

regex_search的用法基本上和regex_match一樣。

if (regex_search(str, m, re))

regex_search不要求str完全匹配re,只要str中的乙個字串匹配re就可以了。所以,m.prefix()和m.suffix()不一定為空。

regex_search是從左往右匹配,而且盡量匹配長的字串。

boost 正規表示式 regex

如果在引用boost regex出現連線錯誤,但是引用其他的庫卻沒有這個錯誤,這是因為對於boost來說,是免編譯的,但是,正則這個庫 是需要單獨編譯和使用的。簡單的辦法就是 直接將boost庫全部編譯,然後 找到正則的lib,編譯時候引用進去。include include include inc...

經典正規表示式

string.prototype.len function return regexp.1 math.pow 255,3 regexp.2 math.pow 255,2 regexp.3 255 regexp.4 1 不過上面的程式如果不用正規表示式,而直接用split函式來分解可能更簡單,程式如下...

正規表示式例項

正規表示式例項 1.驗證數字 只能輸入1個數字 表示式 d 描述 匹配乙個數字 匹配的例子 0,1,2,3 不匹配的例子 2.只能輸入n個數字 表示式 d 例如 d 描述 匹配8個數字 匹配的例子 12345678,22223334,12344321 不匹配的例子 3.只能輸入至少n個數字 表示式 ...