正則表達式詳解<一>
正則表達式是一種處理字符串的微型語言;有以下的基本術語:
l 模式(pattern):正則表達式實際上是通過字符串表達的一個模式
l 匹配(match): 判斷正則表達式和給出的序列[first , last),是否全部匹配
l 搜索(search):判斷在給定的序列裏是否存在和正則表達式匹配的子字符串
l 替換(replace):將匹配到的子字符串替換成其他的字符串
在C++裏邊默認的語法是ECMAScript,這是最強大的正則表達式的語法;
1. ECMAScript語法
1. 錨點(anchor)
特殊字符^和$是錨點,分別匹配到字符串的開頭和結尾。例如:^text$,表達的意思就是只匹配text字符串
2.通配符(wildcard)
可以用來匹配除了換行符以外的任何字符,例如:正則表達式是:a.b,可以匹配到abc,adb,
但是不可是:acdb
3.替換
A|B 可以匹配到A或則是B
4.分組(捕獲組)
例如:(.)(ab|cd)(.)其中有三個標記的子表達式,例如輸入1ab5則可以捕獲到,1 。 ab。5這仨個捕獲組。
5.重復
* 表示匹配零次或則多次之前的部分。例如:a*b 可以匹配到b , ab , aab , aaab
+ 表示匹配一次以及一次以上之前的部分,例如:a+b可以匹配到ab , aab但是不能是b
? 表示匹配到零次或是一次以前的部分,例如: a ? b 可以匹配到ab , b 但是不能位 aab
{…}表示區間重復,a{n}表示匹配到的a剛好位n個,a{n,}表示匹配到的a為n位或則n位以上;a{n,m}表示匹配到的a的個數位>=n和<=m個;
6.貪婪匹配和非貪婪匹配
輸入字符串位: aaabbb
貪婪匹配:正則表達式:(a+)(ab)*(b+) ,匹配到:”aaa””””bbb”
非貪婪匹配:正則表達式:(a+?)(ab)*(b+)匹配到:“aa“”ab””bb”;
7.優先級
第一:元素本身
第二:量詞:+,* , ? {…}
第三:串聯:例如ab+c在量詞之後綁定
第四:替代符| ,最後綁定
例如:正則表達式:ab+c|d,會匹配到abc, abbc , d , 如果添加括號,ab+(c|d)則匹配到
, abc , abbc , abd abbd
8,字符集合匹配
[a-z]表示可以匹配到a到z之間的任意一個字符,(註意是任意一個,而不是多個)
[a-zA-Z]表示可以匹配到a到z以及A到Z之間對的任意一個字符;
另一種方法是使用某種字符類,表示方法[:name:]例如:
[[:digit:]]表示可以匹配到0~9之間的任意一個數字;
這裏的name可以是以下:
Name |
Expression |
digit |
數字 |
d |
和digit一樣 |
xdigit |
數字和表示16進制的abcdef或則ABCDEF |
alpha |
字母字符所有的大小寫 |
alnum |
Alpha和digit的組合 |
w |
和alnum一樣 |
lower |
小寫字母 |
upper |
大寫字母 |
blank |
一行文本中分割單詞的空格符 |
punct |
標點符號字符,包括不是alnum意外的所有圖形字符 |
應用:
問題:表示0~9的任意一個以及多個數字的匹配
解答:(1)[0-9]+
(2) [[:digit:]]+
(3) [[:d:]]+
(4) \d+
問題:匹配除了小寫字母以外的任意字符
解答:(1) [[:upper:]]
(2) [^[:lower:]]
9.後向引用
\n n是>0的整數,表示第n個捕捉組,例如:
正則表達式:([:d:]*)-.*-\1
可以匹配到:123-abc-123 , 789-kdf-789 , 9-m-9
但是不可是:123-abc-1234,必須是123,和第一個捕獲組一樣的內容;
10.C++裏的轉義
轉移\d,在C++裏應該將其轉移,因為\是特殊字符在C++裏,所以需要轉移,轉義位:
\\d.
轉移\,這個更加麻煩。應該轉譯為:\\\\
例如:
正則表達式:( |\\n|\\r|\\\\)
搜索空格 , 換行符 , 回車符 , 反斜杠;
正則表達式詳解<一>