正則表達(dá)式

正則表達(dá)式是一種查找以及字符串替換操作。正則表達(dá)式在文本編輯器中廣泛使用,比如正則表達(dá)式被用于:

檢查文本中是否含有指定的特征詞

找出文中匹配特征詞的位置

從文本中提取信息,比如:字符串的子串

修改文本

與文本編輯器相似,幾乎所有的高級編程語言都支持正則表達(dá)式。在這樣的語境下,“文本”也就是一個字符串,可以執(zhí)行的操作都是類似的。一些編程語言(比如Perl,JavaScript)會檢查正則表達(dá)式的語法。

正則表達(dá)式是什么?

正則表達(dá)式只是一個字符串。沒有長度限制,但是,這樣的正則表達(dá)式長度往往較短。如下所示是一些正則表達(dá)式的例子:

I had a \S+ day today

[A-Za-z0-9-_]{3,16}

\d\d\d\d-\d\d-\d\d

v(\d+)(.\d+)*

TotalMessages="(.*?)"

<[^<>]>

這些字符串實際上都是微型計算機(jī)程序。正則表達(dá)式的語法,實際上是一種輕量級、簡潔、適用于特定領(lǐng)域的編程語言。記住這一點,那么你就很容易理解下面的事情:

每一個正則表達(dá)式,都可以分解為一個指令序列,比如“先找到這樣的字符,再找到那樣的字符,再從中找到一個字符。。。”

每一個正則表達(dá)式都有輸入(文本)和輸出(匹配規(guī)則的輸出,有時是修改后的文本)

正則表達(dá)式有可能出現(xiàn)語法錯誤——不是所有的字符串都是正則表達(dá)式

正則表達(dá)式語法很有個性,也可以說很恐怖

有時可以通過編譯,使得正則表達(dá)式執(zhí)行更快

在實現(xiàn)中,正則表達(dá)式還有其他的特點。本文將重點討論正則表達(dá)式的核心語法,在幾乎所有的正則表達(dá)式中都可以見到這些規(guī)則。

特別提示:正則表達(dá)式與文件通配語法無關(guān),比如 *.xml

正則表達(dá)式的基礎(chǔ)語法

字符

正則表達(dá)式中包含了一系列的字符,這些字符只能匹配它們本身。有一些被稱為“元字符”的特殊字符,可以匹配一些特殊規(guī)則。

如下所示的例子中,我用紅色標(biāo)出了元字符。

I had a \S+ day today

[A-Za-z0-9-_]{3,16}

\d\d\d\d-\d\d-\d\d

v(\d+)(.\d+)*

TotalMessages="(.*?)"

<[^<>]*>

大部分的字符,包括所有的字母和數(shù)字字符,是普通字符。也就意味著,它們只能匹配它們自己,如下所示的正則表達(dá)式:

cat

意味著,只能匹配一個字符串,以“c”開頭,然后是字符“a”,緊跟著是字符“t”的字符串。

到目前為止,正則表達(dá)式的功能類似于

常規(guī)的Find功能

Java中的String.indexOf()函數(shù)

PHP中的strpos()函數(shù)

等等

注意:不做特殊說明,正則表達(dá)式中是區(qū)分大小寫的。但是,幾乎所有正則表達(dá)式的實現(xiàn),都會提供一個Flag用來控制是否區(qū)分大小寫。

點“.”

我們第一個要講解的元字符是“.”。這個符號意味著可以匹配任意一個字符。如下所示的正則表達(dá)式:

c.t

意味著匹配“以c開頭,之后是任意一個字符,緊跟著是字母t”的字符串。

在一段文本中,這樣的正則表達(dá)式可以用來找出cat,cot,czt這樣的字符串,甚至可以找出c.t這樣的組合,但是不能找到ct或者是coot這樣的字符串。

使用反斜杠“\”可以忽略元字符,使得元字符的功能與普通字符一樣。所以,正則表達(dá)式

c.t

表示“找到字母c,然后是一個句號(“.”),緊跟著字母t”

反斜杠本身也是一個元字符,這意味著反斜杠本身也可以通過相似的方法變回到普通字符的用途。因此,正則表達(dá)式

c\t

表示匹配“以字符c開頭,然后是一個反斜杠,緊跟著是字母t”的字符串。

注意!在正則表達(dá)式的實現(xiàn)中,.是不能用于匹配換行符的。”換行符“的表示方法在不同實現(xiàn)中也不同。實際編程時,請參考相關(guān)文檔。在本文中,我認(rèn)為.是可以匹配任意字符的。實現(xiàn)環(huán)境通常會提供一個Flag標(biāo)志位,來控制這一點。

字符類

字符類是一組在方括號內(nèi)的字符,表示可以匹配其中的任何一個字符。

正則表達(dá)式c[aeiou]t,表示可以匹配的字符串是”以c開頭,接著是aeiou中的任何一個字符,最后以t結(jié)尾”。在文本的實際應(yīng)用中,這樣的正則表達(dá)式可以匹配:cat,cet,cit,cot,cut五種字符串。

正則表達(dá)式[0123456789]表示匹配任意一個整數(shù)。

正則表達(dá)式[a]表示匹配單字符a。

包含忽略字符的例子

a表示匹配字符串[a]

[[]\ab]表示匹配的字符為”[“或者”]”或者”a”,或者”b”

[[]]表示匹配的字符為”\”或者 “[”或者”]”

在字符類中,字符的重復(fù)和出現(xiàn)順序并不重要。[dabaaabcc]與[abc]是相同的

重要提示:字符類中和字符類外的規(guī)則有時不同,一些字符在字符類中是元字符,在字符類外是普通字符。一些字符正好相反。還有一些字符在字符類中和字符類外都是元字符,這要視情況而定!

比如,.表示匹配任意一個字符,而[.]表示匹配一個全角句號。這不是一回事!

字符類的范圍

在字符集中,你可以通過使用短橫線來表示匹配字母或數(shù)字的范圍。

[b-f]與[b,c,d,e,f]相同,都是匹配一個字符”b”或”c”或”d”或”e”或”f”

[A-Z]與[ABCDEFGHIJKLMNOPQRSTUVWXYZ]相同,都是匹配任意一個大寫字母。

[1-9]與[123456789]相同,都是匹配任意一個非零數(shù)字。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容