正則表達式詳解<一>


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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM