正規表示式的那點事兒

2021-08-05 21:59:31 字數 4626 閱讀 6408

表1 常用的元字元

符號說明.

匹配除換行符以外的任意字元 \w

匹配字母、數字、下劃線、漢字 \s

匹配任意的空白符,包括:空格、製表符(tab)、換行符、中文全形空格等 \d

匹配一位數字 \b

匹配單詞的開始或結束,也就是單詞的分界處 ^

匹配字串的開始 $

匹配字串的結束

例子: 1)

0\d-\d

匹配以0為開頭,然後是5個數字,然後是乙個連字元「-」最後匹配8個數字。 2)

\ba\w*\b

匹配以字母a開頭的單詞,然後是任意數量的字母、數字、下劃線或漢字。

3)\d+

匹配1個或更多連續的數字。

4)\b\w\b

匹配5個字元的單詞。

注意:

元字元^和$都匹配乙個位置,這和\b有點類似。^匹配你要用來查詢的字串的開頭,$匹配結尾。例如乙個**如果要求你填寫的密碼必須為6位到12位字元時,可以使用:^\d$。

為什麼會有轉義字元呢?如果你想查詢某些特殊含義的字元,比如說元字元本身,這個時候直接查詢是不合適的,因為元字元會被解釋成別的意思,這個時候就會用到轉義字元(\)。例如:

c:\\users

匹配c:\users。

表2 常用的限定符

符號說明*

重複零次或更多次 +

重複一次或更多次 ?

重複零次或一次

重複n次

重複n次或更多次

重複n至m次

例子: 1)

user\d*

匹配user後面跟零個或更多個數字

表3 常用的字元匹配

符號說明[abc]

匹配字母abc

[.?!]

匹配標點符號.或?或

![a-z0-9a-z]

匹配乙個英文本母或數字

[0-9]

匹配任意乙個數字,相當於\d

例子:

1)\(?0\d[) -]?\d

匹配0個或1個

(,然後是匹配乙個

0,後面匹配兩個數字,然後是匹配

)或空格或-中的

0個或1個,最後匹配

8個數字。

正規表示式裡的分支條件是指有很多種規則,如果滿足其中的一種規則就應該予以匹配。分支條件的符號是|,用

|將不同的規則分隔開來。

例子:

1)\(?0\d\)?[- ]?\d|0\d[- ]?\d

該正規表示式可以匹配兩種型別的字串:第一,匹配0個或1個

(,後面匹配乙個

0,接著匹配兩個數字,然後匹配0個或

1個),後面匹配

-或空格

0個或者

1個,最後匹配

8個數字;第二,匹配乙個數字

0,然後匹配兩個數字,接著匹配

-或空格的0個或

1個,最後匹配

8個數字。

注意:

使用分支條件時,要注意各個條件的順序。因為匹配分支條件時,將會從左到右的測試每乙個條件,如果滿足了某個分支的話,就不會再去管其他的條件了。

當需要重複多個字元時,就會用到分組。將需要重複的多個字元用小括號括起來構成乙個子表示式,這個子表示式就是分組。將這個子表示式看成乙個整體,然後就可以指定這個子表示式的重複次數了。

例子:

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)(2[0-4]\d|25[0-5]|[01]?\d\d?)

首先看一下第乙個小括號裡面的內容(2[0-4]\d|25[0-5]|[01]?\d\d?),這是乙個子表示式。這個子表示式裡面又有兩個分支條件。先來看第乙個分支條件,首先匹配乙個數字2,然後匹配數字

0-4中的任意乙個,最後匹配任意乙個數字。再來看第二個分支條件,首先匹配數字

25,然後匹配

0-5中的任意乙個數字。最後看第三個分支條件,首先,匹配數字0或

1中的0個或

1個,然後,匹配乙個任意的數字,最後匹配乙個任意的數字。

第乙個子表示式匹配完成之後,會匹配乙個.。

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)匹配完成之後,會作為乙個分組繼續匹配後面的語句,即重複這個分組3次。最後繼續匹配後面的語句,後面的語句與第乙個子表示式裡面的語句相似,在此就不贅述了。

如果想要查詢除了小寫字母之外,其他任何字元都行的情況。這個時候,用反義是比較方便的,下面是一些常用的反義**。

表4 常用的反義符

符號說明\w

匹配任意不是字母,數字,下劃線,漢字的的字元 \s

匹配任意不是空白符的字元 \d

匹配任意非數字的字元 \b

匹配不是單詞開頭或結束的位置

[^a]

匹配除了a以外的任意字元

例子:

1)\d+

匹配不包含數字的字串 2)

x[^a]+

匹配以x開頭不包含

a的字串

後向引用用於重複搜尋前面某個分組匹配的文字,每個分組都會擁有乙個組號,組號的命名規則是:從左向右,以左括號為標誌,按照出現的順序命名1,2,

...。下面以乙個例子具體展開說明。

\b(\w+)\b\s+\1\b的匹配原則是:首先匹配乙個單詞,然後是乙個或多個空白符,最後是分組一中的內容。所以說,這個正規表示式最終可以匹配重複的單詞,比如like like。

組名也可以自己設定,可以使用(?\w+)或(?'xzw'\w+)來把上例的組名更改為xzw。

零寬斷言是用來查詢某些內容之前或之後(不包含內容本身)的東西的,即零寬斷言是用於指定乙個位置的,下面是常用的四種零寬斷言。

表5 常見的

4種零寬斷言

符號

說明(?=exp)

零寬度正**先行斷言,它斷言自身出現的位置的前面能匹配表示式exp

(?<=exp)

零寬度正回顧後發斷言,它斷言自身出現的位置的後面能匹配表示式exp

(?!exp)

零寬度負**先行斷言,斷言此位置的後面不能匹配表示式exp (?

零寬度負回顧後發斷言,斷言此位置的前面不能匹配表示式exp

所謂懶惰匹配就是指匹配盡可能少的字元,下面給出幾個常用的懶惰限定符。

表6 常用的懶惰限定符

符號說明*?

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

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

??重複0次或

1次,但盡可能少重複

?重複n到

m次,但盡可能少重複

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

表7 常用分組語法

表8  其他符號 符號

說明\a

報警字元 \b

通常是單詞分界位置,但如果在字元類裡使用代表退格 \t

製表符 tab \r

回車 \v豎向製表符 \f

換頁符

\n換行符 \e

escape

\0nn

ascii**中八進位制**為

nn的字元

\xnn

ascii**中十六進製制**為

nn的字元

\unnnn

unicode**中十六進製制**為

nnnn

的字元\cn

ascii控制字元。比如

\cc代表

ctrl+c

\a字串開頭,類似^ \z

字串結尾或行尾 \z

字串結尾,類似$ \g

當前搜尋的開頭 \p

unicode中命名為

name

的字元類

(?>exp)

貪婪子表示式

(?-exp)

平衡組

(?im-nsx:exp)

在子表示式exp中改變處理選項

(?im-nsx)

為表示式後面的部分改變處理選項

(?(exp)yes|no)

把exp當做零寬正向先行斷言,如果在這個位置能匹配,使用

yes作為此組的表示式;否則使用

no(?(exp)yes)

同上,只是使用空表示式作為no

(?(name)yes|no)

如果命名為為name的組捕獲到了內容,使用

yes作為表示式;否則使用

no(?(name)yes)

同上,只是使用空表示式作為no

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

非負整數 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...

正規表示式 開發常用的正規表示式

正規表示式是一種用來進行文字匹配的工具,其語法優美簡潔。在開發中,查詢 對比以及匹配字串是家常便飯的業務,通過正規表示式我們將這些業務描述成某些需求規則,來讓我們的 更美觀 實用。例如我們要驗證使用者輸入的密碼長度是否滿足6 18位的長度,新手最常見的驗證方式是判斷輸入的密碼長度 return te...