什麼是正規表示式?正規表示式是一種用來描述一定數量文字的模式。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個數字 表示式 ...