深入淺出之正規表示式 2

2021-04-20 22:26:04 字數 2737 閱讀 7923

5.字符集字符集是由一對方括號「」括起來的字元集合。使用字符集,你可以告訴正規表示式引擎僅僅匹配多個字元中的乙個。如果你想匹配乙個「a」或乙個「e」,使用<<[ae]>>。你可以使用<>匹配gray或grey。這在你不確定你要搜尋的字元是採用美國英語還是英國英語時特別有用。相反,<>將不會匹配graay或graey。字符集中的字元順序並沒有什麼關係,結果都是相同的。

你可以使用連字元「-」定義乙個字元範圍作為字符集。<<[0-9]>>匹配0到9之間的單個數字。你可以使用不止乙個範圍。<<[0-9a-fa-f] >>匹配單個的十六進製制數字,並且大小寫不敏感。你也可以結合範圍定義與單個字元定義。<<[0-9a-fxa-fx]>>匹配乙個十六進製制數字或字母x。再次強調一下,字元和範圍定義的先後順序對結果沒有影響。

·字符集的一些應用

查詢乙個可能有拼寫錯誤的單詞,比如<> 或 <>。

查詢程式語言的識別符號,<>。(*表示重複0或多次)

查詢c風格的十六進製制數<<0[xx][a-fa-f0-9]+>>。(+表示重複一次或多次)

·取反字符集

在左方括號「[」後面緊跟乙個尖括號「^」,將會對字符集取反。結果是字符集將匹配任何不在方括號中的字元。不像「.」,取反字符集是可以匹配回車換行符的。

需要記住的很重要的一點是,取反字符集必須要匹配乙個字元。<>並不意味著:匹配乙個q,後面沒有u跟著。它意味著:匹配乙個q,後面跟著乙個不是u的字元。所以它不會匹配「iraq」中的q,而會匹配「iraq is a country」中的q和乙個空格符。事實上,空格符是匹配中的一部分,因為它是乙個「不是u的字元」。

如果你只想匹配乙個q,條件是q後面有乙個不是u的字元,我們可以用後面將講到的向前檢視來解決。

·字符集中的元字元

需要注意的是,在字符集中只有4個 字元具有特殊含義。它們是:「] / ^ -」。「]」代表字符集定義的結束;「/」代表轉義;「^」代表取反;「-」代表範圍定義。其他常見的元字元在字符集定義內部都是正常字元,不需要轉義。例如,要搜尋星號*或加號+,你可以用<<[+*]>>。當然,如果你對那些通常的元字元進行轉義,你的正規表示式一樣會工作得很好,但是這會降低可讀性。

在字符集定義中為了將反斜槓「/」作為乙個文字字元而非特殊含義的字元,你需要用另乙個反斜槓對它進行轉義。<<[//x]>>將會匹配乙個反斜槓和乙個x。「]^-」都可以用反斜槓進行轉義,或者將他們放在乙個不可能使用到他們特殊含義的位置。我們推薦後者,因為這樣可以增加可讀性。比如對於字元「^」,將它放在除了左括號「[」後面的位置,使用的都是文字字元含義而非取反含義。如<<[x^]>>會匹配乙個x或^。<>會匹配乙個「]」或「x」。<<[-x]>>或<<[x-]>>都會匹配乙個「-」或「x」。

·字符集的簡寫

因為一些字符集非常常用,所以有一些簡寫方式。

<>代表<<[0-9]>>;

<>代表單詞字元。這個是隨正規表示式實現的不同而有些差異。絕大多數的正規表示式實現的單詞字符集都包含了<>。

<>代表「白字元」。這個也是和不同的實現有關的。在絕大多數的實現中,都包含了空格符和tab符,以及回車換行符<>。

字符集的縮寫形式可以用在方括號之內或之外。<>匹配乙個白字元後面緊跟乙個數字。<<[/s/d]>>匹配單個白字元或數字。<<[/da-fa-f]>>將匹配乙個十六進製制數字。

取反字符集的簡寫

<<[/s]>> = <<[^/s]>>

<<[/w]>> = <<[^/w]>>

<<[/d]>> = <<[^/d]>>

·字符集的重複

如果你用「?*+」操作符來重複乙個字符集,你將會重複整個字符集。而不僅是它匹配的那個字元。正規表示式<<[0-9]+>>會匹配837以及222。

如果你僅僅想重複被匹配的那個字元,可以用向後引用達到目的。我們以後將講到向後引用。

6.使用?*或+ 進行重複

?:告訴引擎匹配前導字元0次或一次。事實上是表示前導字元是可選的。

+:告訴引擎匹配前導字元1次或多次

*:告訴引擎匹配前導字元0次或多次

<[a-za-z][a-za-z0-9]*>匹配沒有屬性的html標籤,「<」以及「>」是文字元號。第乙個字符集匹配乙個字母,第二個字符集匹配乙個字母或數字。

我們似乎也可以用<[a-za-z0-9]+>。但是它會匹配<1>。但是這個正規表示式在你知道你要搜尋的字串不包含類似的無效標籤時還是足夠有效的。

·限制性重複

許多現代的正規表示式實現,都允許你定義對乙個字元重複多少次。詞法是:。min和max都是非負整數。如果逗號有而max被忽略了,則max沒有限制。如果逗號和max都被忽略了,則重複min次。

因此和*一樣,和+ 的作用一樣。

你可以用<>匹配1000~9999之間的數字(「/b」表示單詞邊界)。<>匹配乙個在100~99999之間的數字。

·注意貪婪性

假設你想用乙個正規表示式匹配乙個html標籤。你知道輸入將會是乙個有效的html檔案,因此正規表示式不需要排除那些無效的標籤。所以如果是在兩個尖括號之間的內容,就應該是乙個html標籤。

許多正規表示式的新手會首先想到用正規表示式<< <.+> >>,他們會很驚訝的發現,對於測試字串,「this is a first test」,你可能期望會返回,然後繼續進行匹配的時候,返回。

但事實是不會。正規表示式將會匹配「first」。很顯然這不是我們想要的結果。原因在於「+」是貪婪的。也就是說,「+」會導致正規表示式引擎試圖盡可能的重複前導字元。只有當這種重複會引起整個正規表示式匹配失敗的情況下,引擎會進行回溯。也就是說,它會放棄最後一次的「重複」,然後處理正規表示式餘下的部分。

和「+」類似,「?*」的重複也是貪婪的。

深入淺出之正規表示式

1.什麼是正規表示式 基本說來,正規表示式是一種用來描述一定數量文字的模式。regex代表regular express。本文將用 來表示一段具體的正規表示式。一段文字就是最基本的模式,簡單的匹配相同的文字。2.不同的正規表示式引擎 正規表示式引擎是一種可以處理正規表示式的軟體。通常,引擎是更大的應...

深入淺出正規表示式

正規表示式其實還是蠻簡單的,因為它沒有很強的邏輯在裡頭,我們只需要按照它的規則從頭開始依次去讀就好了 話雖這麼說,我相信很多人一開始接觸正則,當看到那一連串 亂七八糟 的字元時,都會一臉懵逼,這是啥玩意?然後就自然而然的認為這東西很複雜,接著打心底就牴觸使用正則,然後開始在網上搜看是否有現成的表示式...

正規表示式深入淺出 深入淺出資料分析

618買的 深入淺出資料分析 前段時間終於看完了,發現閒魚上的市場還不錯,就擺在上面 了,在被賣出之前,我寫了一篇總結,沒想到的是,文章儲存失誤了,現在書已經賣出去了,想重寫只能靠回憶了。深入淺出資料分析 這本書給我最深的感受是excel上 資料分析 和 規劃求解 兩個選項的使用,在這本書之前我知道...