正則表達(dá)式

一、校驗數(shù)字的表達(dá)式

二、校驗字符的表達(dá)式

三、特殊需求表達(dá)式


速記理解技巧

.[ ]^$

四個字符是所有語言都支持的正則表達(dá)式,所以這四個是基礎(chǔ)的正則表達(dá)式。正則難理解因為里面有一個等價的概念,這個概念大大增加了理解難度,讓很多初學(xué)者看起來會懵,如果把等價都恢復(fù)成原始寫法,自己書寫正則就超級簡單了,就像說話一樣去寫你的正則了:

等價:

等價是等同于的意思,表示同樣的功能,用不同符號來書寫。

?,*,+,\d,\w 都是等價字符

?等價于匹配長度{0,1}

*等價于匹配長度{0,}

+等價于匹配長度{1,}

\d等價于[0-9]

\D等價于[^0-9]

\w等價于[A-Za-z_0-9]

\W等價于[^A-Za-z_0-9]。

常用運(yùn)算符與表達(dá)式:

^ 開始

() 域段

[] 包含,默認(rèn)是一個字符長度

[^] 不包含,默認(rèn)是一個字符長度

{n,m} 匹配長度

. 任何單個字符(\. 字符點)

| 或

\ 轉(zhuǎn)義

$ 結(jié)尾

[A-Z] 26個大寫字母

[a-z] 26個小寫字母

[0-9] 0至9數(shù)字

[A-Za-z0-9] 26個大寫字母、26個小寫字母和0至9數(shù)字

, 分割

.

分割語法:

[A,H,T,W] 包含A或H或T或W字母

[a,h,t,w] 包含a或h或t或w字母

[0,3,6,8] 包含0或3或6或8數(shù)字

語法與釋義:

基礎(chǔ)語法 "^([]{})([]{})([]{})$"

正則字符串 = "開始([包含內(nèi)容]{長度})([包含內(nèi)容]{長度})([包含內(nèi)容]{長度})結(jié)束"

?,*,+,\d,\w 這些都是簡寫的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)這種特殊組合情況下除外。

初學(xué)者可以忽略?,*,+,\d,\w一些簡寫標(biāo)示符,學(xué)會了基礎(chǔ)使用再按表自己去等價替換

實例:

字符串;tel:086-0666-88810009999

原始正則:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"

速記理解:開始 "tel:普通文本"[0-9數(shù)字]{1至3位}"-普通文本"[0數(shù)字][0-9數(shù)字]{2至3位}"-普通文本"[0-9數(shù)字]{8至11位} 結(jié)束"

等價簡寫后正則寫法:"^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$" ,簡寫語法不是所有語言都支持。

替換技巧

編輯

實例目錄

【1】 正則表達(dá)式應(yīng)用——替換指定內(nèi)容到行尾

【2】 正則表達(dá)式應(yīng)用——數(shù)字替換

【3】 正則表達(dá)式應(yīng)用——刪除每一行行尾的指定字符

【4】 正則表達(dá)式應(yīng)用——替換帶有半角括號的多行

【5】 正則表達(dá)式應(yīng)用——刪除空行

【6】 正則表達(dá)式應(yīng)用——實例應(yīng)用

應(yīng)用實例

【1】正則表達(dá)式應(yīng)用——替換指定內(nèi)容到行尾

原始文本如下面兩行

abc aaaaa

123 abc 444

希望每次遇到“abc”,則替換“abc”以及其后到行尾的內(nèi)容為“abc efg”

即上面的文本最終替換為:

abc efg

123 abc efg

解決:

① 在替換對話框,查找內(nèi)容里輸入“abc.*”,替換內(nèi)容輸入為“abc efg”

② 同時勾選“正則表達(dá)式”復(fù)選框,然后點擊“全部替換”按鈕

其中,符號的含義如下:

“.” =匹配任意字符

“*” =匹配0次或更多

注意:其實就是正則表達(dá)式替換,這里只是把一些曾經(jīng)提出的問題加以整理,單純從正則表達(dá)式本身來說,就可以引申出成千上萬種特例。

【2】正則表達(dá)式應(yīng)用——數(shù)字替換

希望把

asdadas123asdasdas456asdasdasd789asdasd

替換為:

asdadas[123]asdasdas[456]asdasdasd[789]asdasd

在替換對話框里面,勾選“正則表達(dá)式”復(fù)選框

在查找內(nèi)容里面輸入“([0-9])([0-9])([0-9])”,不含引號

“替換為:”里面輸入“[\1\2\3]”,不含引號

####備注####:查找([0-9]+) 替換:[\1] 更簡單通用些

范圍為你所操作的范圍,然后選擇替換即可。

實際上這也是正則表達(dá)式的使用特例,“[0-9]”表示匹配0~9之間的任何特例,同樣“[a-z]”就表示匹配a~z之間的任何特例

上面重復(fù)使用了“[0-9]”,表示連續(xù)出現(xiàn)的三個數(shù)字

括號用來選擇原型,進(jìn)行分組,替換時要用

“\1”代表第一個“[0-9]”對應(yīng)的原型,“\2”代表第二個“[0-9]”對應(yīng)的原型,依此類推

“[”|“]”為單純的字符,表示添加“[”或“]”,如果輸入“其它\1\2\3其它”,則替換結(jié)果為:

asdadas其它123其它asdasdas其它456其它asdasdasd其它789其它asdasd

功能增強(qiáng):

如果將查找內(nèi)容“[0-9][0-9][0-9]”改為“[0-9]*[0-9]”,對應(yīng)1 或 123 或 12345 或 ...

大家根據(jù)需要定制

相關(guān)內(nèi)容還有很多,可以自己參考正則表達(dá)式的語法仔

【3】正則表達(dá)式應(yīng)用——刪除每一行行尾的指定字符

因為這幾個字符在行中也是出現(xiàn)的,所以肯定不能用簡單的替換實現(xiàn)

比如

12345 1265345

2345

需要刪除每行末尾的“345”

這個也算正則表達(dá)式的用法,其實仔細(xì)看正則表達(dá)式應(yīng)該比較簡單,不過既然有這個問題提出,說明對正則表達(dá)式還得有個認(rèn)識過程,解決方法如下

解決:

在替換對話框中,啟用“正則表達(dá)式”復(fù)選框

在查找內(nèi)容里面輸入“345$”

這里“$”表示從行尾匹配

如果從行首匹配,可以用“^”來實現(xiàn),不過 EditPlus 有另一個功能可以很簡單的刪除行首的字符串

a. 選擇要操作的行

b. 編輯-格式-刪除行注釋

c. 在彈出對話框里面輸入要清除的行首字符,確定

【4】正則表達(dá)式應(yīng)用——替換帶有半角括號的多行

幾百個網(wǎng)頁中都有下面一段代碼:

<script LANGUAGE="JavaScript1.1">

<!--

htmlAdWH('93163607', '728', '90');

//-->

</SCRIPT>

我想把它們都去掉,可是找了很多search & replace的軟件,都是只能對“一行”進(jìn)行操作。

EditPlus 打開幾百個網(wǎng)頁文件還是比較順暢的,所以完全可以勝任這個工作。

具體解決方法,在 Editplus 中使用正則表達(dá)式,由于“(”、“)”被用做預(yù)設(shè)表達(dá)式(或者可以稱作子表達(dá)式)的標(biāo)志,所以查找

“<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH('93163607', '728', '90'.);\n//-->\n</SCRIPT>\n”

時會提示查找不到,所以也就無法進(jìn)行替換了,這時可以把“(”、“)”使用任意字符標(biāo)記替代,即半角句號:“.”。替換內(nèi)容為

<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH.'93163607', '728', '90'.;\n//-->\n</SCRIPT>\n

在替換對話框啟用“正則表達(dá)式”選項,這時就可以完成替換了

補(bǔ)充:

對( ) 這樣的特殊符號,應(yīng)該用\( \)來表示,這也是很標(biāo)準(zhǔn)的regexp語法,可以寫為

<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH\('93163607', '728', '90'\);\n//-->\n</SCRIPT>\n

【5】正則表達(dá)式應(yīng)用——刪除空行

啟動EditPlus,打開待處理的文本類型文件。

①、選擇“查找”菜單的“替換”命令,彈出文本替換對話框。選中“正則表達(dá)式”復(fù)選框,表明我們要在查找、替換中使用正則表達(dá)式。然后,選中“替換范圍”中的“當(dāng)前文件”,表明對當(dāng)前文件操作。

②、單擊“查找內(nèi)容”組合框右側(cè)的按鈕,出現(xiàn)下拉菜單。

③、下面的操作添加正則表達(dá)式,該表達(dá)式代表待查找的空行。(技巧提示:空行僅包括空格符、制表符、回車符,且必須以這三個符號之一作為一行的開頭,并且以回車符結(jié)尾,查找空行的關(guān)鍵是構(gòu)造代表空行的正則表達(dá)式)。

直接在"查找"中輸入正則表達(dá)式“^[ \t]*\n”,注意\t前有空格符。

(1)選擇“從行首開始匹配”,“查找內(nèi)容”組合框中出現(xiàn)字符“^”,表示待查找字符串必須出文本中一行的行首。

(2)選擇“字符在范圍中”,那么在“^”后會增加一對括號“[]”,當(dāng)前插入點在括號中。括號在正則表達(dá)式中表示,文本中的字符匹配括號中任意一個字符即符合查找條件。

(3)按一下空格鍵,添加空格符。空格符是空行的一個組成成分。

(4)選擇“制表符”,添加代表制表符的“\t”。

(5)移動光標(biāo),將當(dāng)前插入點移到“]”之后,然后選擇“匹配 0 次或更多”,該操作會添加星號字符“*”。星號表示,其前面的括號“[]”內(nèi)的空格符或制表符,在一行中出現(xiàn)0個或多個。

(6)選擇“換行符”,插入“\n”,表示回車符。

④、“替換為”組合框保持空,表示刪除查找到的內(nèi)容。單擊“替換”按鈕逐個行刪除空行,或單擊“全部替換”按鈕刪除全部空行(注意:EditPlus有時存在“全部替換”不能一次性完全刪除空行的問題,可能是程序BUG,需要多按幾次按鈕)。

【6】 正則表達(dá)式應(yīng)用——實例應(yīng)用

1.驗證用戶名和密碼:("^[a-zA-Z]\w{5,15}$")正確格式:"[A-Z][a-z]_[0-9]"組成,并且第一個字必須為字母6~16位;

2.驗證電話號碼:("^(\d{3,4}-)\d{7,8}$")正確格式:xxx/xxxx-xxxxxxx/xxxxxxxx;

3.驗證手機(jī)號碼(包含虛擬號碼和新號碼段):"^1([38][0-9]|4[5-9]|5[0-3,5-9]|66|7[0-8]|9[89])[0-9]{8}$";

4.驗證身份證號(15位):"\d{14}[[0-9],0-9xX]",(18位):"\d{17}(\d|X|x)";

5.驗證Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");

6.只能輸入由數(shù)字和26個英文字母組成的字符串:("^[A-Za-z0-9]+$");

7.整數(shù)或者小數(shù):^[0-9]+([.][0-9]+){0,1}$

8.只能輸入數(shù)字:"^[0-9]*$"。

9.只能輸入n位的數(shù)字:"^\d{n}$"。

10.只能輸入至少n位的數(shù)字:"^\d{n,}$"。

11.只能輸入m~n位的數(shù)字:"^\d{m,n}$"。

12.只能輸入零和非零開頭的數(shù)字:"^(0|[1-9][0-9]*)$"。

13.只能輸入有兩位小數(shù)的正實數(shù):"^[0-9]+(\.[0-9]{2})?$"。

14.只能輸入有1~3位小數(shù)的正實數(shù):"^[0-9]+(\.[0-9]{1,3})?$"。

15.只能輸入非零的正整數(shù):"^\+?[1-9][0-9]*$"。

16.只能輸入非零的負(fù)整數(shù):"^\-[1-9][0-9]*$"。

17.只能輸入長度為3的字符:"^.{3}$"。

18.只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。

19.只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。

20.只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。

21.驗證是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。

22.只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"。

23.驗證URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。

24.驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"10"~"12"。

25.驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"、"10"~"29"和“30”~“31”。

26.獲取日期正則表達(dá)式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?

評注:可用來匹配大多數(shù)年月日信息。

27.匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]

評注:可以用來計算字符串的長度(一個雙字節(jié)字符長度計2,ASCII字符計1)

28.匹配空白行的正則表達(dá)式:\n\s*\r

評注:可以用來刪除空白行

29.匹配HTML標(biāo)記的正則表達(dá)式:<(\S*?)[^>]*>.*?</>|<.*? />

評注:網(wǎng)上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復(fù)雜的嵌套標(biāo)記依舊無能為力

30.匹配首尾空白字符的正則表達(dá)式:^\s*|\s*$

評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達(dá)式

31.匹配網(wǎng)址URL的正則表達(dá)式:[a-zA-z]+://[^\s]*

評注:網(wǎng)上流傳的版本功能很有限,上面這個基本可以滿足需求

32.匹配帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

評注:表單驗證時很實用

33.匹配騰訊QQ號:[1-9][0-9]{4,}

評注:騰訊QQ號從10 000 開始

34.匹配中國郵政編碼:[1-9]\\d{5}(?!\d)

評注:中國郵政編碼為6位數(shù)字

35.匹配ip地址:([1-9]{1,3}\.){3}[1-9]。

評注:提取ip地址時有用

36.匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]

Function IsRegu(Regu,s)

'正則表達(dá)式校驗

If Regu="" Then

Exit Function

End if

Dim Re,Sre

Set Re = New RegExp

Re.Pattern = Regu

Sre = Re.Test(s)

If Sre = True Then

IsRegu = True

Else

IsRegu = False

End If

End Function

tmp=" "

if (IsRegu("\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*",tmp )) =false then

msgbox "E-mail地址不合法 !"

FieldCheck#N=false

不同的語言(如PHP和JAVA)、相同語言的不同類庫(如來自Sun的Java Regular Expression類庫跟Apache Jakarta的正則表達(dá)式類庫)間,用法會有所差別,在使用的時候,要注意這些差別。

驗證URL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

functionIsValidUrl(str){

varregu="^(https?://)"

+"?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?"

+"(([0-9]{1,3}\.){3}[0-9]{1,3}"

+"|"

+"([0-9a-z_!~*'()-]+\.)*"

+"([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\."

+"[a-z]{2,6})"

+"(:[0-9]{1,4})?"

+"((/?)|"

+"(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";

varre=newRegExp(regu);

if(!re.test(str)){

returnfalse;

}

returntrue;

}

參考:

零寬斷言

編輯

用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說它們像\b,^,$那樣用于指定一個位置,這個位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:

(?=exp)也叫零寬度正預(yù)測先行斷言,它斷言自身出現(xiàn)的位置的后面能匹配表達(dá)式exp。比如\b\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。

(?<=exp)也叫零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。

假如你想要給一個很長的數(shù)字中每三位間加一個逗號(當(dāng)然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?<=\D)\D{3})+\b,用它對xxxxxxxxxx進(jìn)行查找時結(jié)果是xxxxxxxxx

下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數(shù)字(再次強(qiáng)調(diào),不包括這些空白符)

斷言用來聲明一個應(yīng)該為真的事實。正則表達(dá)式中只有當(dāng)斷言為真時才會繼續(xù)進(jìn)行匹配。

負(fù)向零寬

編輯

如果我們只是想要確保某個字符沒有出現(xiàn),但并不想去匹配它時怎么辦?例如,如果我們想查找這樣的單詞--它里面出現(xiàn)了字母q,但是q后面跟的不是字母u,我們可以嘗試這樣:

\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發(fā)現(xiàn),如果q出現(xiàn)在單詞的結(jié)尾的話,像Iraq,Benq,這個表達(dá)式就會出錯。這是因為[^u]總要匹配一個字符,所以如果q是單詞的最后一個字符的話,后面的[^u]將會匹配q后面的單詞分隔符(可能是空格,或者是句號或其它的什么),后面的\w*\b將會匹配下一個單詞,于是\b\w*q[^u]\w*\b就能匹配整個Iraq fighting。負(fù)向零寬斷言能解決這樣的問題,因為它只匹配一個位置,并不消費(fèi)任何字符。,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b。

零寬度負(fù)預(yù)測先行斷言(?!exp),斷言此位置的后面不能匹配表達(dá)式exp。例如:\d{3}(?!\d)匹配三位數(shù)字,而且這三位數(shù)字的后面不能是數(shù)字;\b((?!abc)\w)+\b匹配不包含連續(xù)字符串a(chǎn)bc的單詞。

同理,我們可以用(?<!exp),零寬度負(fù)回顧后發(fā)斷言來斷言此位置的前面不能匹配表達(dá)式exp:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數(shù)字。

請詳細(xì)分析表達(dá)式(?<=<(\w+)>).*(?=<\/\1>),這個表達(dá)式最能表現(xiàn)零寬斷言的真正用途。

一個更復(fù)雜的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標(biāo)簽內(nèi)里的內(nèi)容。(?<=<(\w+)>)指定了這樣的前綴:被尖括號括起來的單詞(比如可能是<b>),然后是.*(任意的字符串),最后是一個后綴(?=<\/\1>)。注意后綴里的\/,它用到了前面提過的字符轉(zhuǎn)義,將”/“轉(zhuǎn)義;\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內(nèi)容,這樣如果前綴實際上是<b>的話,后綴就是</b>了。整個表達(dá)式匹配的是<b>和</b>之間的內(nèi)容(再次提醒,不包括前綴和后綴本身)。


最后編輯于
?著作權(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)容