正規表示式 一

2021-04-13 05:15:11 字數 3584 閱讀 1485

若你使用過windows/dos下用於檔案查詢的萬用字元,也就是*和?。如果你想查詢某個目錄下的所有的word文件的話,你會搜尋*.doc。*會被解釋成任意的字串。

和萬用字元類似,正規表示式也是用來進行文字匹配的工具,只不過比萬用字元更能精確地描述你的需求。比如你可以編寫乙個正規表示式來查詢所有以0開頭,後面跟著2-3個數字,然後是乙個連字型大小「-」,最後是7或8位數字的字串(像010-12345678或0376-7654321)。

入門在編寫處理字串的程式或網頁時,經常會有查詢符合某些複雜規則的字串的需要。正規表示式就是用於描述這些規則的工具。換句話說,正規表示式就是記錄文字規則的**。例如,d+就是乙個簡潔的**,代表著規則1位或更多位數字,2008就符合這個規則,而a3則不符合(它包含了不是數字的字元)。

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

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

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

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

b是正規表示式規定的乙個特殊**,代表著單詞的開頭或結尾。雖然通常英文的單詞是由空格或標點符號或換行為分隔的,但是b並不代表這些單詞分隔符中的任何乙個,只代表乙個位置。

假如你要找的是hi後面不遠處跟著乙個lucy,你應該用bhib.*blucyb。//先是乙個單詞hi,然後是任意個任意字元(但不能是換行),最後是lucy這個單詞。

注意:.是另乙個特殊**,代表除了換行符以外的任意字元。*同樣是特殊的**,不過它代表的是數量。它指定*前邊的內容可以重複任意次以使整個表示式得到匹配。因此,.*連在一起就意味著任意數量的不包含換行的字元。

同時使用其它的特殊**,我們就能構造出功能更強大的正規表示式。比如下面這個例子:0dd-dddddddd代表著這樣的字串:以0開頭,然後是兩個數字,然後是乙個連字型大小「-」,最後是8個數字(中國的**號碼,這個例子只能匹配區號為3位的情形)。

這裡的d是乙個特殊**,代表任意的數字(0,或1,或2,或。。。)。-不是特殊**,只代表它本身–連字型大小。

為了避免重複,我們可以這樣寫表示式:0d-d//d後面的()指定的是前面d必須連續重複出現2次(8次)。

b,.,*,d.事實上還有更多的特殊**,比如s代表任意的空白符,包括空格,製表符(tab),換行符。w代表著字母或數字。

下面來試試更多的例子:

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

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

bwb 匹配剛好6個字母/數字的單詞。

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

w匹配字母或數字

s匹配任意的空白符

d匹配數字

b匹配單詞的開始或結束

^匹配字串的開始

$匹配字串的結束

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

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

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

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

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

例如:www.unibetter.com匹配www.unibetter.com,c:/windows匹配c:windows,2^8匹配2^8(通常這是2的8次方的書寫方式)。

重複前面的*,+,,這幾個代表重複的方式。下面是正規表示式中所有指定重複的方式:

*重複零次或更多次

+重複一次或更多次

?重複零次或一次

重複n次

重複n次或更多次

重複n到m次

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

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

13d匹配以13後面跟9個數字(中國的手機號)

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

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

很簡單,你只需要在中括號裡列出它們就行了,像[aeiou]就匹配任何乙個母音字母,[.?!]匹配標點符號(.或?或!)(英文語句通常只以這三個標點結束)。要注意的是,在中括號中,特殊**不會被解釋成其它意義,所以我們不需要寫成[.?!](事實上這樣寫會出錯,因為出現了兩次)。

我們也可以輕鬆地指定乙個字元範圍,像[0-9]代表的含意與d是完全一致的:一位數字,同理[a-z0-9a-z]也完全等同於w。

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

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

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

w匹配任意不是字母和數字的字元

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

d匹配任意非數字的字元

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

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

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

例子:s+代表不包含空白符的字串。

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

替換好了,現在終於到了解決3位或4位區號問題的時間了。正規表示式裡的替換指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。看例子:

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

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

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

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

正規表示式一

工欲善其事,必先利其器,jq原始碼中充斥的大量的正規表示式,我準備根據李炎恢老師的正規表示式的講解,寫一篇有關正規表示式的筆記!不墨跡,直接進入正題!ecmascript 的 regexp 類 表示正規表示式 正規表示式在jq中被大量運用,主要是為了檢索字串,進行匹配 建立正規表示式 var box...

正規表示式(一)

定義和使用 var patt1 new regexp hello var patt2 world test方法 test 方法檢索字串中的指定值。返回值是 true 或 false。var pat my var str this is my code.console.log pat.test str...