正则表达式知识详解(转自晴天碧日)
一、什么是正則表達(dá)式?
1.定義:
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串做替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。構(gòu)造正則表達(dá)式的方法和創(chuàng)建數(shù)學(xué)表達(dá)式的方法一樣。也就是用多種元字符與運(yùn)算符可以將小的表達(dá)式結(jié)合在一起來(lái)創(chuàng)建更大的表達(dá)式。正則表達(dá)式的組件可以是單個(gè)的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。
2.組成:
正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。
3.何時(shí)使用:驗(yàn)證——從頭到尾完整匹配!
????????????查找——只要部分匹配即可!
二、正則表達(dá)式的基本語(yǔ)法和規(guī)則
?1.備選字符集:規(guī)定某*一位字符*可用的備選字符的集合
??????語(yǔ)法:[可選字符列表]
??????強(qiáng)調(diào):1.?無(wú)論備選字符集包含多少字符,只能選1個(gè)
????????????2.?必須選1個(gè)!
??????比如:6位數(shù)字的密碼
[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
?????簡(jiǎn)化:1.?當(dāng)備選字符連續(xù)時(shí),可用-表示范圍的區(qū)間
????????比如:[0123456789]-->[0-9]
????????[0-9][0-9][0-9][0-9][0-9][0-9]
????????[a-z]-->1位小寫字母
????????[A-Z]-->1位大寫字母
????????[A-Za-z]-->1位字母,大小寫都行
????????[0-9a-zA-Z]-->1位字母或數(shù)字都行
?????反選:[^不能選的字符列表]
?????比如:[^47]?強(qiáng)調(diào):^作“除了”使用時(shí),只能放在開頭
2.?預(yù)定義字符集:為常用的字符集專門提供的簡(jiǎn)化寫法!
????“\d”-->[0-9]-->1位數(shù)字
????“\w”-->[0-9a-zA-Z_]-->1位字母,數(shù)字或_
????“\s”-->1位空字符:匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。
?“?. “:?除換行回車外的任何一個(gè)字符,如:
"a.[0-9]":表示一個(gè)字符串有一個(gè)"a"后面跟著一個(gè)任意字符和一個(gè)數(shù)字;
"^.{3}$":表示有任意三個(gè)字符的字符串(長(zhǎng)度為3個(gè)字符)
\t--------匹配一個(gè)制表符???
????預(yù)定義字符的反義:預(yù)定義字符的大寫形式都是小寫的反義
????\D---->1位非數(shù)字字符
\S------匹配任何非空白字符。等價(jià)于 [^\f\n\r\t\v]。
\v------匹配一個(gè)垂直制表符
\n------匹配一個(gè)換行符
\r-------匹配一個(gè)回車符
?3.?數(shù)量詞:規(guī)定相鄰的字符集可出現(xiàn)的次數(shù)
? 確定數(shù)量:3種:
{n}-->?必須反復(fù)出現(xiàn)n位
???????????{n,m}-->?最少出現(xiàn)n次,最多出現(xiàn)m次
???????????{n,}-->至少出現(xiàn)n次,多了不限!
??????比如:/^\d{6}$/——6位數(shù)字
??????手機(jī)號(hào)規(guī)則:
????????第1位:只能是1
????????第2位:[34578]
????????第3位之后,必須是9位數(shù)字
??????手機(jī)號(hào):/^1[34578]\d{9}$/
?不確定數(shù)量:3種:
????????*:?有沒有都行,次數(shù)不限,相當(dāng)于{0,}
????????+:?至少1次,重復(fù)次數(shù)不限,相當(dāng)于{1,}
?????????:?有沒有都行,最多1次,相當(dāng)于{0,1}
????????():分組
????????|:?左右兩正則表達(dá)式選其一
??????身份證號(hào)邏輯:
????????前15位數(shù)字
????????16,17位必須是數(shù)字
????????最后一位可以是數(shù)字或X x
????????后三位 可有可無(wú),如果有,只能出現(xiàn)一次
??????\d{15}(\d\d[0-9Xx])?
?
??????手機(jī)號(hào):
????????手機(jī)號(hào)前可能出現(xiàn)+86或0086。
????????前綴可有可無(wú),且只能出現(xiàn)一次
????????前綴和手機(jī)號(hào)之間可以有或沒有任意個(gè)空字符?
??第1位:只能是1
????????第2位:[34578]
????????第3位之后,必須是9位數(shù)字
??????手機(jī)號(hào):
??????(\+86|0086)?\s*1[34578]\d{9}
????
4.?指定匹配位置:
??????^表達(dá)式:?必須以表達(dá)式的規(guī)則為開頭
??????表達(dá)式$:?必須以表達(dá)式的規(guī)則為結(jié)尾
?????比如:選擇字符串開頭的空格?^\s*
???????????選擇結(jié)尾空格?\s*$
???????????選擇開頭或結(jié)尾的空格?^\s*|\s*$
?????*預(yù)告:今后只要在程序中執(zhí)行驗(yàn)證:都要前加^后加$*
????????????表示從頭到尾完整匹配。
?????比如:test():
???????^\d{6}$——從頭到尾必須只能是6位數(shù)字
???????1234567
5.?預(yù)判:在正式匹配正則表達(dá)式之前,先預(yù)讀整個(gè)字符串,進(jìn)行初步匹配,如果預(yù)判都未通過(guò),則不再驗(yàn)證!
?1)(?=表達(dá)式):?先瀏覽字符串是否滿足表達(dá)式的要求
??????何時(shí)使用:只要正則中出現(xiàn)類似"而且"
??????比如:4位數(shù)字,但不能包含4和7
??????(?=[^47]$)?是否由除了4,7之外的字符組成
?2)(?!表達(dá)式):先檢查字符串是否不滿足表達(dá)式要求
比如:6位以上密碼。
???字母,數(shù)字組成
???????????首字母不能是數(shù)字: [a-zA-Z][a-zA-Z0-9]{5,}
???????????必須至少包含1個(gè)大寫字母
???????????不能都由小寫字母和數(shù)字組成: (?![a-z0-9]+$)
???????????必須至少包含1個(gè)數(shù)字
???????????不能都由小寫字母和大寫字母組成:
??????????? (?![a-zA-Z]+$)
6.特殊字符
所謂特殊字符,就是一些有特殊含義的字符,如"*.txt"中的*,簡(jiǎn)單的說(shuō)就是表示任何字符串的意思。如果要查找文件名中有*的文件,則需要對(duì)*進(jìn)行轉(zhuǎn)義,即在其前加一個(gè)\。ls \*.txt。許多元字符要求在試圖匹配它們時(shí)特別對(duì)待。若要匹配這些特殊字符,必須首先使字符"轉(zhuǎn)義",即,將反斜杠字符 (\) 放在它們前面。下面列出了正則表達(dá)式中的特殊字符:(請(qǐng)注意在方括號(hào)中,不需要轉(zhuǎn)義字符。)
“$”------匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請(qǐng)使用 \$。
“()”----標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。子表達(dá)式可以獲取供以后使用。要匹配這些字符,請(qǐng)使用 \( 和 \)。
“*”----匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請(qǐng)使用 \*。
“+”-----匹配前面的子表達(dá)式一次或多次。要匹配 + 字符,請(qǐng)使用 \+。
“.”----匹配除換行符 \n之外的任何單字符。要匹配 .,請(qǐng)使用 \.。
“[”------標(biāo)記一個(gè)中括號(hào)表達(dá)式的開始。要匹配 [,請(qǐng)使用 \[。
“?”----匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。要匹配 ? 字符,請(qǐng)使用 \?。
“\”----將下一個(gè)字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進(jìn)制轉(zhuǎn)義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "(".
“^”-----匹配輸入字符串的開始位置,除非在方括號(hào)表達(dá)式中使用,此時(shí)它表示不接受該字符集合。要匹配 ^ 字符本身,請(qǐng)使用 \^。
“{”----標(biāo)記限定符表達(dá)式的開始。要匹配 {,請(qǐng)使用 \{。
“|”----指明兩項(xiàng)之間的一個(gè)選擇。要匹配 |,請(qǐng)使用 \|。
7.?貪婪模式和懶惰模式:
???貪婪模式:默認(rèn)情況下,正則表達(dá)式會(huì)匹配最大的符合條件的字符串, *、+和?限定符都是貪婪的,因?yàn)樗鼈儠?huì)盡可能多的匹配文字,只有在它們的后面加上一個(gè)?就可以實(shí)現(xiàn)非貪婪或最小匹配。
???貪婪模式原因:(.*) (.+)
???懶惰模式:正則表達(dá)式僅匹配最小的符合規(guī)則的字符串
???比如:篩選網(wǎng)頁(yè)中的a元素:
??????<a\s+(.*)href\s*=\s*["']([^'"]*)["']
???貪婪模式-->懶惰模式:.*? ??
例如:
您可能搜索?HTML?文檔,以查找括在?H1?標(biāo)記內(nèi)的章節(jié)標(biāo)題。該文本在您的文檔中如下:
<h1> Chapter 1 - Introduction to Regular Expression</h1>
下面的表達(dá)式匹配從開始小于符號(hào)?(<)?到關(guān)閉?H1?標(biāo)記的大于符號(hào)?(>)?之間的所有內(nèi)容。
/<.*>/
如果您只需要匹配開始?H1?標(biāo)記,下面的"非貪心"表達(dá)式只匹配?<H1>。
/<.*?>/
通過(guò)在?*、+?或???限定符之后放置??,該表達(dá)式從"貪心"表達(dá)式轉(zhuǎn)換為"非貪心"表達(dá)式或者最小匹配。
?
三、常用正則表達(dá)式示例及說(shuō)明:
1.正則表達(dá)式驗(yàn)證控制文本框的輸入字符類型
1)只能輸入數(shù)字和英文的:?
<input οnkeyup="value=value.replace(/[\W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text1" NAME="Text1">
2)只能輸入數(shù)字的:
<input οnkeyup="value=value.replace(/[^\d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text2" NAME="Text2">
3)只能輸入全角的:?
<input οnkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" ID="Text3" NAME="Text3">
4)只能輸入漢字的:?
<input οnkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" ID="Text4" NAME="Text4">
2.正則表達(dá)式的應(yīng)用實(shí)例通俗說(shuō)明
*******************************************************************************
//校驗(yàn)是否全由數(shù)字組成
/^[0-9]{1,20}$/
^ 表示打頭的字符要匹配緊跟^后面的規(guī)則
$ 表示打頭的字符要匹配緊靠$前面的規(guī)則
[ ] 中的內(nèi)容是可選字符集
[0-9] 表示要求字符范圍在0-9之間
{1,20}表示數(shù)字字符串長(zhǎng)度合法為1到20,即為[0-9]中的字符出現(xiàn)次數(shù)的范圍是1到20次。
/^ 和 $/成對(duì)使用應(yīng)該是表示要求整個(gè)字符串完全匹配定義的規(guī)則,而不是只匹配字符串中的一個(gè)子串。
*******************************************************************************
//校驗(yàn)登錄名:只能輸入5-20個(gè)以字母開頭、可帶數(shù)字、“_”、“.”的字串
/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/
^[a-zA-Z]{1} 表示第一個(gè)字符要求是字母。
([a-zA-Z0-9]|[._]){4,19} 表示從第二位開始(因?yàn)樗o跟在上個(gè)表達(dá)式后面)的一個(gè)長(zhǎng)度為4到9位的字符串,它要求是由大小寫字母、數(shù)字或者特殊字符集[._]組成。
*******************************************************************************
//校驗(yàn)用戶姓名:只能輸入1-30個(gè)以字母開頭的字串
/^[a-zA-Z]{1,30}$/
*******************************************************************************
//校驗(yàn)密碼:只能輸入6-20個(gè)字母、數(shù)字、下劃線
/^(\w){6,20}$/
\w:用于匹配字母,數(shù)字或下劃線字符
*******************************************************************************
//校驗(yàn)普通電話、傳真號(hào)碼:可以“+”或數(shù)字開頭,可含有“-” 和 “ ”
/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/
\d:用于匹配從0到9的數(shù)字;
“?”元字符規(guī)定其前導(dǎo)對(duì)象必須在目標(biāo)對(duì)象中連續(xù)出現(xiàn)零次或一次
可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等
*******************************************************************************
//校驗(yàn)URL
/^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/ (表示url串的長(zhǎng)度為length(“https://”) + n )
\ / :表示字符“/”。
. 表示所有字符的集
+ 等同于{1,},就是1到正無(wú)窮吧。
*************************************************************************
三、RegExp?對(duì)象和方法
在Javascript中,通過(guò)RegExp對(duì)象來(lái)支持正則表達(dá)式。創(chuàng)建正則表達(dá)式的方式有兩種:
1.最簡(jiǎn)單的創(chuàng)建正則表達(dá)式的方法:字面量形式
Var expression=/pattern/flags
其中pattern部分可以使任何簡(jiǎn)單的正則表達(dá)式
Flags表示正則表達(dá)式的標(biāo)志,正則表達(dá)式的匹配模式支持3個(gè)標(biāo)志:
1)”g”:表示全局(globle)模式,即模式被應(yīng)用于所有字符串,而非在發(fā)現(xiàn)第一個(gè)匹配項(xiàng)是立即停止。
2)“i”:表示不區(qū)分大小寫模式,即在確定匹配項(xiàng)是忽略模式于字符串的大小寫。
3)“m”:表示多行模式,即在到達(dá)一行文本末尾是還會(huì)繼續(xù)查找下一行中是否存在與模式匹配的項(xiàng)。例如:
/*匹配字符串中所有”at”的實(shí)例*/
Var paatern1=/at/g;
/*匹配第一個(gè)”bat”或”cat”,不區(qū)分大小寫*/
Var paatern2=/[bc]at/i;
/*匹配所有以”at”結(jié)尾的3個(gè)字符串的組合,不區(qū)分大小寫*/
Var paatern2=/.at/gi;
2.使用RegExp構(gòu)造函數(shù)創(chuàng)建正則表達(dá)式
Var expression=new Regexp(“[bc]at”,”i”);
其中傳給RegExp構(gòu)造函數(shù)的兩個(gè)參數(shù)都是字符串(不能把正則表達(dá)式的字面量傳遞給RegExp構(gòu)造函數(shù)),也因此,在某些情況下要對(duì)字符進(jìn)行雙重轉(zhuǎn)義。所有的元字符都必須進(jìn)行雙重轉(zhuǎn)義。例如:
字面量模式:
/\[bc\]at/ ??/\.at/ ??/name\/age/ ??/\d.\d{1,2}/ ?/\w\\hello\\123/
等價(jià)的字符串形式:
“\\[bc\\]at”??“\\.at”??“name\\/age”??“\\d.\\d{1,2}”???“\\w\\\\hello\\\\123”
注意:使用正則表達(dá)式字面量和使用RegExp構(gòu)造函數(shù)創(chuàng)建的正則表達(dá)式不一樣,正則表達(dá)式字面量始終會(huì)共享同一個(gè)RegExp實(shí)例,而構(gòu)造函數(shù)創(chuàng)建的每一個(gè)新RegExp實(shí)例都是一個(gè)新實(shí)例(動(dòng)態(tài)創(chuàng)建的)。
3.Exec()?查找方法
Exec()接受一個(gè)參數(shù),即要應(yīng)用模式的字符串,然后返回包含第一個(gè)匹配項(xiàng)的信息的數(shù)組,如果沒有找到則返回null。返回的數(shù)組包含兩個(gè)屬性:index和input,index表示匹配項(xiàng)在字符串中的位置,input表示應(yīng)用正則表達(dá)式的字符串。
對(duì)于exec()而言即使在模式中設(shè)置了全局模式(g),它每次也只會(huì)返回一個(gè)匹配項(xiàng),但是如果設(shè)置了全局模式,每次調(diào)用它都會(huì)返回字符串中的下一個(gè)匹配項(xiàng),知道搜索到字符串的末尾為止。所以自全局匹配模式下,lastIndex的值在每次調(diào)用exec()后,都會(huì)增加,所以要想獲取所有的匹配項(xiàng)內(nèi)容和下標(biāo),需要循環(huán)獲取。而在非全局模式下lastIndex則始終不變。
4.test()驗(yàn)證方法
此方法要求驗(yàn)證的字符串和正則表達(dá)式從頭到尾完全匹配,需要”^”和”$”符號(hào)。
Reg.test(str):?如果匹配,返回true,否則返回false。Test()方法經(jīng)常被用在if語(yǔ)句中,經(jīng)常被用在驗(yàn)證用戶輸入的情況下,驗(yàn)證用戶輸入是不是有效。
例如:
Var text=”000-00-0000”;
Var pattern=/\d{3}-\d{2}-\d{4}/;
If(pattern.test(text)){
Atert(“the pattern was matched”);
}
原地址https://www.cnblogs.com/mingxiastory/p/5426913.html
轉(zhuǎn)載于:https://www.cnblogs.com/mlban/p/8405176.html
總結(jié)
以上是生活随笔為你收集整理的正则表达式知识详解(转自晴天碧日)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: maven 国内私服
- 下一篇: 网络相关的面试题