C 正規表示式regex初探及踩的坑

2021-10-03 02:36:53 字數 2768 閱讀 1731

regex是從c++ 11開始有的。

c++正規表示式提供了以下幾個主要功能:

math:將整個輸入與正規表示式進行比對。

search:查詢是否與正規表示式匹配的子串。

tokenize:根據正規表示式進行切分取得想要的目標子字串。

replace:替換與正規表示式匹配的子字串(乙個或多個)。

首先先看乙個簡單的例子

#include

#include

int main(int argc, char *ar**)

else

}catch (const

std::regex_error &e)

return

0;}

**執行結果:

match

下面來說下基本使用方法。首先宣告乙個正規表示式:

std::regex pattern("t_[^_]*_[^_]*_.*");
然後呼叫匹配方法:

regex_match("t_123_345_456", pattern);

如果有正規表示式有異常或匹配出現異常會丟擲regex_error的異常,該異常派生自std::runtime_error.

regex支援多種正規表示式語法,包括:ecmascript、basic(posix的bre)、extended(posix的ere)、awk、grep、egrep。預設使用的是ecmascript。你也可以自己指定語法,如:

std::regex pattern("t_[^_]*_[^_]*_.*", std::regex_constants::grep);
如果你想獲取匹配的內容則需要使用std::smatch,看下面一段**:

#include

#include

int main(int argc, char *ar**)

else

} catch (const

std::regex_error &e)

return

0;}

執行結果:

m.empty():0

m.size():1

match

m.str():t_123_345_456

m.position():0

m.length():13

regex_match會將匹配結果放到regex_match裡,標頭檔案裡是這樣定義的:

typedef match_results

char*> cmatch;

typedef match_results<:const_iterator> smatch;

可以看到標頭檔案裡宣告了兩個特例模板,乙個是針對c-string,另乙個是c+±string。因為我使用的是smatch,所以第二個例子裡呼叫regex_match的時候第乙個引數是構造了個string物件。

從程式執行結果來看,返回的是匹配整個字串資訊,包括匹配到的字串、開始位置、長度等資訊。

如果我只想獲取匹配的某個子字串應該怎麼處理呢。先看下面的例子:

#include

#include

int main(int argc, char *ar**)

} else

}catch (const

std::regex_error &e)

return

0;}

程式執行輸出:

m.empty():0

m.size():4

match

m.str():t_123_345_456

m.position():0

m.length():13

m[0].str():t_123_345_456

m[0].position():0

m[0].length():13

m[1].str():123

m[1].position():2

m[1].length():3

m[2].str():345

m[2].position():6

m[2].length():3

m[3].str():456

m[3].position():10

m[3].length():3

這裡用到分組的概念,用()進行分組,需要哪部分將相應的規則用()包含起來。

**裡的正規表示式:

"t_([^_]*)_([^_]*)_(.*)"
我例子裡是對三組數子感興趣,所以正規表示式裡會匹配到三個子串。

從結果可以看到smatch第乙個元素是整個字串的匹配資訊,從第二個元素開始是你所需要的分組對應的子串。

當我使用gcc-4.8.5對**進行編譯時,沒有報錯,但是當正規表示式裡包含時在執行的時候會丟擲異常:

code:4

what:regex_error

一直懷疑自己的正規表示式寫錯了,後來發現gcc-4.9.0以下版本雖然有regex標頭檔案,但是gcc很不厚道的沒有實現,語法完全支援,但是庫還沒跟上,所以編譯的時候是沒有問題的,但是一執行就會直接丟擲異常。

花了好多時間安裝公升級到4.9.0後能夠正常執行,就是上面例子的結果。坑了好久!

C 11 Regex正規表示式初探

早就知道c 11標準增加了regex支援,昨天在vs2015試了下,很好用 今天在linux的g 上一試,發現g 就是坑啊,一編譯執行直接丟擲regex error異常,這才知道。g 到4.9才支援regex,以前就只是個殼子 更新到4.9.3後就能正常使用了 其中主要的演算法為regex sear...

正規表示式regex

正規表示式 regular expression 是乙個字串,表示一定的規則 api文件的pattern類中有其具體的規則定義 注意 regex嚴格區分大小寫 package cn.itcast.demo02 public class regexdemo02 檢驗郵箱位址是否合法 規則 123456...

RegEx正規表示式

eg select prod name from products where prod name regexp 000 描述了乙個規則,通過這個規則可以匹配一類字串平台雲 字母 數字 漢字 下劃線 以及沒有特殊定義的標點符號,都是 普通字元 能夠與多種字元匹配的表示式 注意區分大小寫,大寫是相反的...