正規表示式

2021-08-29 00:00:23 字數 3416 閱讀 7771

字元

描述\cx

匹配由x指明的控制字元

\f匹配乙個換頁符

\n匹配乙個換行符

\r匹配乙個回車符

\s匹配任何空白字元,包括空格、製表符、換頁符等等。

\s匹配任何非空空白字元

\t匹配乙個製表符

\v匹配乙個垂直製表符\轉義

\d匹配數字字元,相當於[0-9]

\d匹配非數字字元,等效於[^0-9]

\w匹配任何字母數字和下劃線,等效於[a-za-z0-9_]

\w匹配任何非字母數字和下劃線,等效於[^a-za-z0-9_]

\xnn表示數字,和ascii碼表對應

\num

num表示數字,表示捕獲到的第乙個表示式

\n表示反向引用或者八進位制數

\un匹配unicode

$匹配輸入字串的結尾位置

()標記乙個子表示式的開始和結束位置

*匹配前面的子表示式零次或多次

+匹配前面的子表示式一次或多次

.匹配除換行符\n之外的任何單字元

[表示乙個字符集的開始

?匹配前面的子表示式零次或一次,或指明乙個非貪婪限定符

\將下乙個字元標記為其本身

^匹配輸入字串的開始位置。除非在中使用,此時表示不接受該字元集合

匹配確定的n次

至少匹配n次

n<=m,最少匹配n次且最多匹配m次

*和+都是貪婪的,意思是會盡可能的多匹配,但是在後面加上?就可以使他們變成非貪婪的

非貪婪表示最小匹配。

字元描述

^匹配輸入字串開始的位置

$匹配字串的結尾位置

\b匹配乙個單詞的邊界,即字與空格間的位置

\b非單詞邊界匹配

專案描述

(express)

匹配並捕獲匹配的該字串,可以使用\n來指定

(?:express)

匹配的結果會顯示,但是無法通過\num來引用

(?=express)

非捕獲匹配,匹配的結果不顯示。向前查詢

(?<=express)

非捕獲匹配。向後查詢

(?非捕獲匹配。負向後查詢

(?!express)

非捕獲匹配。負向前查詢

regex_match返回乙個bool值,表示是否完全匹配。

regex_match可以有2個引數,待匹配字串、正規表示式

std::string str = "once again";    //待匹配字串

std::regex expression("[a-z]+\\s[a-z]+"); //正規表示式

bool boolean; //返回值true or false

boolean = std::regex_match(str, expression);

regex_match也可以有3個引數,待匹配字串,需要儲存的字串,正規表示式

std::string str = "once again";

std::regex expression("([a-z]+)\\s([a-z]+)");

std::smatch result; //儲存結果容器

bool boolean;

boolean = std::regex_match(str, result, expression);

for(int i=0;iregex_search表示搜尋匹配,只要待匹配字串中的子字串符合正規表示式,則返回true,否則返回false。

與regex_match一樣,regex_search也可以有2個引數,3個引數,甚至是4個引數。

2個引數判斷子字串是否符合正規表示式

3個引數可以將第乙個符合正規表示式的子字串儲存下來

4個引數可以將所有符合正規表示式的子字串儲存下來

下面只講4個引數的情況

std::string str = "once again boom";

std::regex expression("[a-z]+");

std::smatch result;

std::string::const_iterator start = str.begin(); //定義兩個迭代器

std::string::const_iterator end = str.end();

while(std::regex_search(start, end, result, expression))

regex_replace替換其中符合正規表示式的子字串

std::string str = "once again";

std::regex expression("([a-z]+)");

std::cout << std::regex_replace(str, expression, "hello") << std::endl;

//輸出:

//hello hello

regex_replace調換順序

std::string str = "once again";

std::regex expression("([a-z]+)(\\s)([a-z]+)");

std::cout << std::regex_replace(str, expression, "$3$2$1") << std::endl;

//輸出

//again once

參考

正規表示式-菜鳥教程

1.正規表示式的作用是是資訊的搜尋和替換

2.不同語言對於正規表示式的底層實現方式有差異

3.正規表示式可以直接使用文字

4.^表示非時,是作用於[ ]中所有的字元,而不僅限於^後面的那個字元

5.匹配十六進製制\x,使用八進位制\0

6.也可以使用posix類類匹配,[:alnum:]、[:alpha:]等

7.?可以使*或者+變成非貪婪型(匹配的越少越好)

8.|表示或,表示兩邊可以任選乙個,但是要注意或的邊界,即|表示的並不是左邊的乙個字元,或者右邊的乙個字元,而是左邊的一群字元,和右邊的一群字元

9.子表示式用()來表示,在同乙個表示式中可以用\1,\2,\3來表示子表示式的次序。如果在另外乙個表示式中需要引用該子表示式的話,需要用$1,$2,$3來表示

10.子表示式的替換操作,替換操作也是乙個正規表示式

\l:把l和e之間的字元全部轉為小寫

\u:把u和e之間的字元全部轉為大寫

\e:終結l和u

10.向前查詢(?=)的長度是可變的,向後查詢的長度是固定的(?<=)

11.嵌入條件查詢,(?(1)a|b)表示第乙個查詢條件知否存在,存在則選擇a,不存在則選擇b

12.前後查詢條件?(?=)

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...