備忘(五)正規表示式

2021-05-17 12:24:13 字數 4914 閱讀 4785

正規表示式(regular expression)是一種功能強大的字串樣式比較技術。正規表示式最早是從unix系統被開發出來的。它是由一群特殊符號所組成的字串,表示特定的文字樣式,被用於比較某段字串或文章裡,符合正規表示式所代表的樣式文字,例如,乙個簡單的正規表示式【1-9】,可以用來表示字串中1-9的數字。.net根據perl語言定義了與其完全相容的一組完整的語法元素。

1.

正規表示式中的元字元

正規表示式中的元字元代表了表示字元的全部意義。都有哪些常用的元字元呢。

元字元

匹配除換行符外的所有字元。 /w

匹配字母、數字、下劃線、漢字。 /s

匹配空白符(空格)。 /d

匹配數字。 /b

絕對匹配表示式的開始或結束。表示式中只要包含完全匹配即可。 ^

絕對匹配表示式的開始。和$配合表示必須完全匹配。 $

絕對匹配表示式的結束。和^配合必須完全匹配。

關於^、$和/b的使用區別。

^/w@/w+$:

這個正規表示式表示完全匹配。如abc@efg@msn這個表示式不滿足此表示式。/b/w@/w+/b:這個正規表示式表示字串中部分絕對匹配。如上面的表示式結果是abc@efg。

2.

正規表示式中用於表示重複的字元

元字元

說明

舉例*

0次或多次的字元

/w*:0個或多個字母、數字、漢字、下劃線 ?

0次或1次字元

/d?:0個或1個數字。 +

1次貨多次字元

/d+:1個或多個數字。

n次字元。

/b/d/b

:決定匹配8個數字,如果沒有/b則包含8個數字即可。

n到m次字元 /d

:2到6個數字。

n次以上字元 /d

:兩個以上的數字。

3.

轉義字元

正規表示式中的轉義字元用「

/」來完成。例如我們要匹配「

」的正規表示式:

^/d/

/w$。那麼匹配它的字串應該是這樣的形式:

024

ab。因為「

」在正規表示式中是元字元代表除換行符外的所有字元,所以需要轉義。

4.

範圍內字元匹配:[ ]

正規表示式利用[ ]來匹配範圍內的字串。例如[auio]/d表示開頭匹配auio總的任何乙個字元,後面是三位數字的字串。[01]表示匹配0和1的任何字元。[0-9a-za-z]表示所有數字和字母。

5.

分支條件

利用「|」把規則分開,並從左向右進行匹配。表示匹配的字串滿足其中乙個規則即可。例如我們編寫正規表示式實現**號碼的匹配形式為:024-23887575(02423887575)或0411-2345759(04112345759)。我們可以這樣來實現:

^/d[-]?/d$|^/d[-]?/d$。

6.

分組匹配

前面我們已經學過怎麼重複單個字元(直接在字元後面加上限定符)如:/b[a]/d+/b。表示以aaa開頭後面是多個數字。但是如果想要重複多個字元又該怎麼辦呢。我們可以用小括號來指定子表示式(也叫做分組),然後你就可以指定這個表示式的重複次數了。例如我們編寫正規表示式來匹配簡單的ip位址。(/d/. .)/d。要理解這個表示式,請按照下列順序分析它:/d匹配1-3位數字,(/d/ .)匹配三位數字加上乙個小數點,作為分組重複3次。

7.

反義元字元

有時需要查詢不屬於某個能簡單定義的字元類的字元。比如想找除了數字意外其它的任意字元,這時就需要用到反義。在正規表示式中表示反義的元字元有:

元字元(大寫)

/w

除了字母、數字、下劃線、漢字外的所有字元。 /s

除了空格外的所有字元。 /d

除了數字意外的所有字元。 /b

除了開頭和結尾外絕對匹配。

[^x]

除了x以外的其它字元。

[^auio]

除了a、u、i、o外的其它字元。

8.

反向引用

使用小括號指定乙個子表示式後,匹配這個子表示式的文字可以在表示式或其它程式中作進一步的處理。預設情況下,每個分組會自動擁有乙個組號,規則是:從左向右,以小括號的左括號為標誌,第乙個出現的分組組號為1,第二個為2,以此類推。

後向引用用於重複收索前面某個分組匹配的文字。例如

/1代表分組

1匹配的文字。難以理解?我們看看例項。

/b(/w+)/b/s+/1/b

這個正規表示式可以用來

匹配重複的表示式

,如:go go

或者helphelp

。這個表示式中的

(/w+)

被分組並命名組號為

1,而後面的

/1表示重複前面的表示式的內容。這個重複與前面的重複的字元不同,它代表重複的內容,而重複字元是指重複的形式。

你也可以自己指定子表示式的組名。語法形式:(?/w+)。這個語法「?」就把子表示式的組名命名為「wold」了。如果想捕獲前面的組中的內容實用這樣的語法:「/k」上面的正規表示式可以改為:/b(?/w+)/b/s+/k/b。

9.

零寬斷言

零寬斷言是指利用表示式來指定乙個位置,這個位置應該滿足乙個條件。如:/b、^和$。對於零寬斷言我們有以下幾個形式: ø

(?=exp)

:零寬度正**先行斷言。它表示

斷言自身出現的位置的後面能匹配表示式exp

結果得到前面部分,不包括exp表示式本身的內容

。例如:

/b/w+(?=ing/b),

匹配以ing

結尾的單詞的前面部分(除了

ing以外的部分

),如查詢

i』m singing while you』re dancing

。時,它會匹配

sing

和danc

。(相當於字串的後面部分與

exp匹配)。斷言用來宣告乙個應該為真的事實。正規表示式中只有當斷言為真時才會繼續匹配。

ø(?!exp)

:零寬度負**先行斷言。

它斷言此位置的後面不能匹配表示式exp

。例如:

/d(?!/d)

。它表示匹配三位數字後不能是數字。

ø(?<=exp)

:零寬度正回顧後發言,

它斷言自身出現的位置的前面能匹配表示式exp,結果得到除了exp表示式的後半部分

。例如:

(?<=/bre

)/w+/b

。它表示匹配以

re開頭的單詞的後半部分(除了

re部分)。如查詢字串

reading a book

時,它的匹配結果是

ading。ø

(?:零寬度負**先行斷言:

它斷言此位置的後面不能匹配表示式exp

。例如:

(?表示匹配前面不是小寫字母的

7為數字。

乙個更為複雜的例子:(?<=<(/w+)>).*(?=)它匹配不包含屬性的簡單html標籤裡的內容。

10.

貪婪與懶惰

當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。以這個表示式為例:

a.*b

,他將會匹配最長的以

a開始,以

b結束的字串。如果用它來搜尋

aabab

,它會匹配

aabab

整個串。這被稱為

貪婪匹配

。有時我們需要匹配盡可能少的串,我們稱為

懶惰匹配

。我們只需將前面的表示式改動一下,加乙個「?」即可。

a.*?b:

匹配最短的,以

a開始,以

b結束的字串。結果就是

aab和ab。

我們來看一下懶惰限定符:

字元

說明*?

重複任意次,但盡可能少重複。 +?

重複1次或更多次,但盡可能少重複。 ??

重複0次或1次,但盡可能少重複。 ?

重複n次到m次,但盡可能少重複。 ?

重複n次以上,但盡可能少重複。

正規表示式備忘

1 為萬用字元,表示任何乙個字元,例如 a.c 可以匹配 anc abc acc 2 在內可以指定要求匹配的字元,例如 a nbc c 可以匹配 anc abc acc 但不可以匹配 ancc a到z可以寫成 a z 0到9可以寫成 0 9 3 數量限定符號,表示匹配次數 或者叫做長度 的符號 包括...

正規表示式整理備忘

1 符號 符下兩ows表研究室的火熱,當晨在 雖然並非c 正規表示式的 成員 但是它經常與c 正規表示式出雙入對。表示,跟在它後面的字串是個 逐字字串 不是很好理解,舉個例子,以下兩個宣告是等效的 string x d my huang my doc string y d my huang my d...

正規表示式備忘筆記

1.常用的元字元 說明 匹配除換行符以外的任意字元 w 匹配字母或數字或下劃線或漢字 s 匹配任意的空白符 d 匹配數字 b 匹配單詞的開始或結束 匹配字串的開始 匹配字串的結束 2.常用的限定符 說明 重複零次或更多次 重複一次或更多次 重複零次或一次 重複n次 重複n次或更多次 重複n到m次 3...