了解 什麼是正規表示式?

2021-04-13 00:46:27 字數 1890 閱讀 8616

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

很可能你使用過windows/dos下用於檔案查詢的萬用字元(wildcard),也就是*和?。如果你想查詢某個目錄下的所有的word文件的話,你會搜尋*.doc。在這裡,*會被解釋成任意的字串。和萬用字元類似,正規表示式也是用來進行文字匹配的工具,只不過比起萬用字元它能更精確地描述你的需求--當然,代價就是更複雜。比如你可以編寫乙個正規表示式來查詢所有以0開頭,後面跟著2-3個數字,然後是乙個連字型大小"-",最後是7或8位數字的字串(像010-12345678或0376-7654321)。

正規表示式是用於進行文字匹配的工具,所以本文裡多次提到了在字串裡搜尋/查詢,這種說法的意思是在給定的字串中,尋找與給定的正規表示式相匹配的部分。有可能字串裡有不止乙個部分滿足給定的正規表示式,這時每乙個這樣的部分被稱為乙個匹配。匹配在本文裡可能會有三種意思:一種是形容詞性的,比如說乙個字串匹配乙個表示式;一種是動詞性的,比如說在字串裡匹配正規表示式;還有一種是名詞性的,就是剛剛說到的"字串中滿足給定的正規表示式的一部分"。

入門學習正規表示式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下面給出了不少簡單的例子,並對它們作了詳細的說明。

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

這是最簡單的正規表示式了,它可以精確匹配這樣的字串:由兩個字元組成,前乙個字元是h,後乙個是i。通常,處理正規表示式的工具會提供乙個忽略大小寫的選項,如果選中了這個選項,它可以匹配hi,hi,hi,hi這四種情況中的任意一種。

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

/b是正規表示式規定的乙個特殊**(好吧,某些人叫它元字元,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格或標點符號或換行來分隔的,但是/b並不匹配這些單詞分隔符中的任何乙個,它只匹配乙個位置。(如果需要更精確的說法,/b匹配這樣的位置:它的前乙個字元和後乙個字元不全是/w)

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

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

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

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次)。

正規表示式概述 什麼是正規表示式

正規表示式概述 正規表示式在程式語言中存在著廣泛的應用,特別是用來處理字串。如匹配字串 查詢字串 替換字串等。可以說,正規表示式是一段文字或乙個公式,它是用來描述用某種模式去匹配一類字串的公式,並且該公式具有一定的模式。本小節將介紹正規表示式的基本概念 第乙個正規表示式,以及測試正規表示式的工具co...

什麼是正規表示式

正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元 及這些特定字元的組合,組成乙個 規則字串 這個 規則字串 用來表達對字串的一種過濾邏輯。給定乙個正規表示式和另乙個字串,我們可以達到如下的目的 1.給定的字串是否符合正規表示式的過濾邏輯 稱作 匹配 2.可以通過正規表示式,從字串...

什麼是正規表示式

什麼是正規表示式 正規表示式是一種特殊的字串模式,用於匹配一組字串,就好比用模具做產品,而正則就是這個模具,定義一種規則去匹配符合規則的字元。在查閱很多相關正則的描述之後,發現對於 w 的釋義都是指包含大 小寫字母數字和下劃線 相當於 0 9a za z 但是在實際使用中發現並不是這麼回事,也可以說...