一、校驗數(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)容(再次提醒,不包括前綴和后綴本身)。
