java基礎(十一) 正規表示式

2021-09-12 19:59:59 字數 3438 閱讀 1123

本文在閱讀一位大牛博主寫的一篇文章後,感覺深受其用,在此做個筆記總結學習一下,大牛博主位址為:

在編寫處理字串的程式或網頁時,經常會有查詢符合某些複雜規則的字串的需要。正規表示式就是用於描述這些規則的工具。換句話說,正規表示式就是記錄文字規則的**。

入門例子

例子1:假設你在一篇英文**裡查詢hi,你可以使用正規表示式hi。

不幸的是,很多單詞裡包含hi這兩個連續的字元,比如him,history,high等等。用hi來查詢的話,這裡邊的hi也會被找出來。如果要精確地查詢hi這個單詞的話,我們應該使用\bhi\b。

\b是正規表示式規定的乙個特殊**(好吧,某些人叫它元字元,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b並不匹配這些單詞分隔字元中的任何乙個,它只匹配乙個位置。

例子2:假如你要找的是hi後面不遠處跟著乙個lucy,你應該用\bhi\b.*\blucy\b。

這裡,.是另乙個元字元,匹配除了換行符以外的任意字元。同樣是元字元,不過它代表的不是字元,也不是位置,而是數量——它指定前邊的內容可以連續重複使用任意次以使整個表示式得到匹配。因此,.連在一起就意味著任意數量的不包含換行的字元。現在\bhi\b.\blucy\b的意思就很明顯了:先是乙個單詞hi,然後是任意個任意字元(但不能是換行),最後是lucy這個單詞。

換行符就是』\n』,ascii編碼為10(十六進製制0x0a)的字元。

如果同時使用其它元字元,我們就能構造出功能更強大的正規表示式。比如下面這個例子:

0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字串:以0開頭,然後是兩個數字,然後是乙個連字型大小「-」,最後是8個數字(也就是中國的**號碼。當然,這個例子只能匹配區號為3位的情形)。

這裡的\d是個新的元字元,匹配一位數字(0,或1,或2,或……)。-不是元字元,只匹配它本身——連字元(或者減號,或者中橫線,或者隨你怎麼稱呼它)。

為了避免那麼多煩人的重複,我們也可以這樣寫這個表示式:0\d-\d。這裡\d後面的()的意思是前面\d必須連續重複匹配2次(8次)。

下面來看看更多的例子:

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

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

例子三:\b\w\b 匹配剛好6個字元的單詞。

元字元(和數字6在同乙個鍵位上的符號)和$都匹配乙個位置,這和\b有點類似。^匹配你要用來查詢的字串的開頭,$匹配結尾。這兩個**在驗證輸入的內容時非常有用,比如乙個**如果要求你填寫的qq號必須為5位到12位數字時,可以使用:\d$。

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

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

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

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

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

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

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

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

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

很簡單,你只需要在方括號裡列出它們就行了,像[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)。

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

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

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

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

二十一 正規表示式

正規表示式簡介 概念 正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元 及這些特定字元的組合,組成乙個 規則字串 這個 規則字串 用來表達對字串的一種過濾邏輯 可以用來做檢索,擷取或者替換操作 作用 1.給定的字串是否符合正規表示式的過濾邏輯 稱作 匹配 2.可以通過正規表示式,...

一 正規表示式基礎

正規表示式是一種用來匹配字串的強有力的 設計思想是用一種描述性的語言來給字串定義乙個規則,凡是符合規則的字串,就認為它 匹配 否則就不匹配。行定位符用來描述字串的邊界。表示行的開始,表示行的結束。例如 若要匹配以am開頭的字串,則是 am 若要匹配以am結尾的字串,則是am 其中 放在方括號裡,表示...

python學習筆記 十一 正規表示式

一.基礎知識 d 匹配乙個數字 w 匹配乙個字母或數字 匹配任意字元 表示任意個字元 表示至少乙個字元 表示0個或1個字元 表示n個字元,表示n m個字元 s 表示匹配乙個空格 包括tab等空白符 s 表示至少乙個空格 0 9a za z 可以匹配乙個數字 字母或者下劃線 0 9a za z 可以匹...