正規表示式

2022-08-21 19:42:10 字數 3084 閱讀 1953

元字元

現在你已經知道幾個很有用的元字元了,如\b,.,*,還有\d.正規表示式裡還有更多的元字元,比如\s匹配任意的空白符,包括空格,製表符(tab),換行符,中文全形空格等。\w匹配字母或數字或下劃線或漢字等。

對中文/漢字的特殊處理是由.net提供的正規表示式引擎支援的,其它環境下的具體情況請檢視相關文件。

\ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。

好吧,現在我們說說正規表示式裡的單詞是什麼意思吧:就是不少於乙個的連續的\w。不錯,這與學習英文時要背的成千上萬個同名的東西的確關係不大 :)

\d+匹配1個或更多連續的數字。這裡的+是和*類似的元字元,不同的是*匹配重複任意次(可能是0次),而+則匹配重複1次或更多次。

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

\w匹配字母或數字或下劃線或漢字

\s匹配任意的空白符

\d匹配數字

\b匹配單詞的開始或結束

^匹配字串的開始

$匹配字串的結束

元字元^(和數字6在同乙個鍵位上的符號)和$都匹配乙個位置,這和\b有點類似。

^匹配你要用來查詢的字串的開頭,$匹配結尾。這兩個**在驗證輸入的內容時非常有用,比如乙個**如果要求你填寫的qq號必須為5位到12位數字時,可以使用:^\d$。

這裡的和前面介紹過的是類似的,只不過匹配只能不多不少重複2次,則是重複的次數不能少於5次,不能多於12次,否則都不匹配。

因為使用了^和$,所以輸入的整個字串都要用來和\d來匹配,也就是說整個輸入必須是5到12個數字,因此如果輸入的qq號能匹配這個正規表示式的話,那就符合要求了。

和忽略大小寫的選項類似,有些正規表示式處理工具還有乙個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配行的開始處和結束處。

轉義字元

如果你想查詢元字元本身的話,比如你查詢.,或者*,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。這時你就得使用\來取消這些字元的特殊意義。因此,你應該使用\.和\*。當然,要查詢\本身,你也得用\\.

例如:deerchao\.net匹配deerchao.net,c:\\windows匹配c:\windows。

你已經看過了前面的*,+,,這幾個匹配重複的方式了。下面是正規表示式中所有的限定符(指定數量的**,例如*,等):

重複表2.常用的限定符

**/語法說明*

重複零次或更多次

+重複一次或更多次

?重複零次或一次

重複n次

重複n次或更多次

重複n到m次

下面是一些使用重複的例子:

windows\d+匹配windows後面跟1個或更多數字

^\w+匹配一行的第乙個單詞(或整個字串的第乙個單詞,具體匹配哪個意思得看選項設定)

字元類要想查詢數字,字母或數字,空白是很簡單的,因為已經有了對應這些字元集合的元字元,但是如果你想匹配沒有預定義元字元的字元集合(比如母音字母a,e,i,o,u),應該怎麼辦?

很簡單,你只需要在方括號裡列出它們就行了,像[aeiou]就匹配任何乙個英文母音字母,[.?!]匹配標點符號(.或?或!)。

我們也可以輕鬆地指定乙個字元範圍,像[0-9]代表的含意與\d就是完全一致的:一位數字;同理[a-z0-9a-z_]也完全等同於\w(如果只考慮英文的話)。

下面是乙個更複雜的表示式:\(?0\d[)

-]?\d。

「(」和「)」也是元字元,後面的分組節裡會提到,所以在這裡需要使用轉義。

這個表示式可以匹配幾種格式的**號碼,像(010)88886666,或022-22334455,或02912345678等。我們對它進行一些分析吧:首先是乙個轉義字元\(,它能出現0次或1次(?),然後是乙個0,後面跟著2個數字(\d),然後是)或-或空格中的乙個,它出現1次或不出現(?),最後是8個數字(\d)。

不幸的是,剛才那個表示式也能匹配010)12345678或(022-87654321這樣的「不正確」的格式。要解決這個問題,我們需要用到分枝條件。正規表示式裡的分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。聽不明白?沒關係,看例子:

0\d-\d|0\d-\d這個表示式能匹配兩種以連字型大小分隔的**號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。

\(?0\d\)?[- ]?\d|0\d[- ]?\d這個表示式匹配3位區號的**號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字型大小或空格間隔,也可以沒有間隔。你可以試試用分枝條件把這個表示式擴充套件成也支援4位區號的。

我們已經提到了怎麼重複單個字元(直接在字元後面加上限定符就行了);但如果想要重複多個字元又該怎麼辦?你可以用小括號來指定子表示式(也叫做分組),然後你就可以指定這個子表示式的重複次數了,你也可以對子表示式進行其它一些操作(後面會有介紹)。

(\d\.)\d是乙個簡單的ip位址匹配表示式。要理解這個表示式,請按下列順序分析它:\d匹配1到3位的數字,(\d\.)匹配三位數字加上乙個英文句號(這個整體也就是這個分組)重複3次,最後再加上乙個一到三位的數字(\d)。

ip位址中每個數字都不能大於255. 經常有人問我, 01.02.03.04 這樣前面帶有0的數字, 是不是正確的ip位址呢? 答案是: 是的, ip 位址裡的數字可以包含有前導 0 (leading zeroes).

理解這個表示式的關鍵是理解2[0-4]\d|25[0-5]|[01]?\d\d?,這裡我就不細說了,你自己應該能分析得出來它的意義。

有時需要查詢不屬於某個能簡單定義的字元類的字元。比如想查詢除了數字以外,其它任意字元都行的情況,這時需要用到反義:

表3.常用的反義**

**/語法

說明\w

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

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

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

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

[^x]

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

[^aeiou]

匹配除了aeiou這幾個字母以外的任意字元

例子:\s+匹配不包含空白符的字串。

]+>匹配用尖括號括起來的以a開頭的字串。

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

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

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...