1. 程式人生 > >正則表達式詳解<一>

正則表達式詳解<一>

正則表達式詳解 包括 標記 ali 匹配 repl 其他 應用 文本

正則表達式是一種處理字符串的微型語言;有以下的基本術語:

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|\\\\)

搜索空格 , 換行符 , 回車符 , 反斜杠;

正則表達式詳解<一>