正則表達(dá)式(入門)

工具:正則表達(dá)式可視化

正則表達(dá)式基本語法

兩個(gè)特殊的符號(hào)'^'和'$'辉浦。他們的作用是分別指出一個(gè)字符串的開始和結(jié)束冯痢。例子如下:

"^The":表示所有以"The"開始的字符串("There"野芒,"The cat"等);
"of despair$":表示所以以"of despair"結(jié)尾的字符串娶桦;
"^abc$":表示開始和結(jié)尾都是"abc"的字符串——呵呵贾节,只有"abc"自己了;
"notice":表示任何包含"notice"的字符串衷畦。

像最后那個(gè)例子栗涂,如果你不使用兩個(gè)特殊字符,你就在表示要查找的串在被查找串的任意部分——你并不把它定位在某一個(gè)頂端祈争。
其它還有'*'斤程,'+'和'?'這三個(gè)符號(hào),表示一個(gè)或一序列字符重復(fù)出現(xiàn)的次數(shù)铛嘱。它們分別表示“沒有或更多”暖释,“一次或更多”還有“沒有或一次”。下面是幾個(gè)例子:

"ab*":表示一個(gè)字符串有一個(gè)a后面跟著零個(gè)或若干個(gè)b墨吓。("a", "ab", "abbb",……)球匕;
"ab+":表示一個(gè)字符串有一個(gè)a后面跟著至少一個(gè)b或者更多;
"ab?":表示一個(gè)字符串有一個(gè)a后面跟著零個(gè)或者一個(gè)b帖烘;
"a?b+$":表示在字符串的末尾有零個(gè)或一個(gè)a跟著一個(gè)或幾個(gè)b亮曹。

你也可以使用范圍,用大括號(hào)括起,用以表示重復(fù)次數(shù)的范圍照卦。

"ab{2}":表示一個(gè)字符串有一個(gè)a跟著2個(gè)b("abb")式矫;
"ab{2,}":表示一個(gè)字符串有一個(gè)a跟著至少2個(gè)b;
"ab{3,5}":表示一個(gè)字符串有一個(gè)a跟著3到5個(gè)b役耕。

請(qǐng)注意采转,你必須指定范圍的下限(如:"{0,2}"而不是"{,2}")。還有瞬痘,你可能注意到了故慈,'*','+'和
'?'相當(dāng)于"{0,}"框全,"{1,}"和"{0,1}"察绷。
還有一個(gè)':',表示“或”操作:

"hi:hello":表示一個(gè)字符串里有"hi"或者"hello"津辩;
"(b:cd)ef":表示"bef"或"cdef"拆撼;
"(a:b)*c":表示一串"a""b"混合的字符串后面跟一個(gè)"c";

'.'可以替代任何字符:

"a.[0-9]":表示一個(gè)字符串有一個(gè)"a"后面跟著一個(gè)任意字符和一個(gè)數(shù)字喘沿;
"^.{3}$":表示有任意三個(gè)字符的字符串(長(zhǎng)度為3個(gè)字符)闸度;
方括號(hào)表示某些字符允許在一個(gè)字符串中的某一特定位置出現(xiàn):
"[ab]":表示一個(gè)字符串有一個(gè)"a"或"b"(相當(dāng)于"a|b");
"[a-d]":表示一個(gè)字符串包含小寫的'a'到'd'中的一個(gè)(相當(dāng)于"a|b|c|d"或者"[abcd]")摹恨;
"^[a-zA-Z]":表示一個(gè)以字母開頭的字符串筋岛;
"[0-9]%":表示一個(gè)百分號(hào)前有一位的數(shù)字;
",[a-zA-Z0-9]$":表示一個(gè)字符串以一個(gè)逗號(hào)后面跟著一個(gè)字母或數(shù)字結(jié)束晒哄。

你也可以在方括號(hào)里用''表示不希望出現(xiàn)的字符,''應(yīng)在方括號(hào)里的第一位肪获。(如:"%[^a-zA-Z]%"表
示兩個(gè)百分號(hào)中不應(yīng)該出現(xiàn)字母)寝凌。

為了逐字表達(dá),你必須在"^.$():*+?{"這些字符前加上轉(zhuǎn)移字符''孝赫。
請(qǐng)注意在方括號(hào)中较木,不需要轉(zhuǎn)義字符。

正則表達(dá)式的應(yīng)用實(shí)例通俗說明

//校驗(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到19位的字符串,它要求是由大小寫字母、數(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到正無窮吧草巡。

正則表達(dá)式的應(yīng)用

"^\d+$"  //非負(fù)整數(shù)(正整數(shù) + 0) 
"^[0-9]*[1-9][0-9]*$"  //正整數(shù) 
"^((-\d+)|(0+))$"  //非正整數(shù)(負(fù)整數(shù) + 0) 
"^-[0-9]*[1-9][0-9]*$"  //負(fù)整數(shù) 
"^-?\d+$"    //整數(shù) 
"^\d+(\.\d+)?$"  //非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0) 
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮點(diǎn)數(shù) 
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0) 
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //負(fù)浮點(diǎn)數(shù) 
"^(-?\d+)(\.\d+)?$"  //浮點(diǎn)數(shù) 
"^[A-Za-z]+$"  //由26個(gè)英文字母組成的字符串 
"^[A-Z]+$"  //由26個(gè)英文字母的大寫組成的字符串 
"^[a-z]+$"  //由26個(gè)英文字母的小寫組成的字符串 
"^[A-Za-z0-9]+$"  //由數(shù)字和26個(gè)英文字母組成的字符串 
"^\w+$"  //由數(shù)字守呜、26個(gè)英文字母或者下劃線組成的字符串 
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil
"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //電話號(hào)碼
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址
^([0-9A-F]{2})(-[0-9A-F]{2}){5}$   //MAC地址的正則表達(dá)式
^[-+]?\d+(\.\d+)?$  //值類型正則表達(dá)式

特殊字符

所謂特殊字符,就是一些有特殊含義的字符山憨,如上面說的 runoo*b 中的 查乒,簡(jiǎn)單的說就是表示任何字符串的意思。如果要查找字符串中的 * 符號(hào)郁竟,則需要對(duì) * 進(jìn)行轉(zhuǎn)義玛迄,即在其前加一個(gè) : runo*ob 匹配 runoob。

許多元字符要求在試圖匹配它們時(shí)特別對(duì)待棚亩。若要匹配這些特殊字符蓖议,必須首先使字符"轉(zhuǎn)義",即讥蟆,將反斜杠字符\ 放在它們前面勒虾。下表列出了正則表達(dá)式中的特殊字符:

特別字符 描述
$ 匹配輸入字符串的結(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)使用 \“豎杠”争剿。

限定符

限定符用來指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種痊末。

正則表達(dá)式的限定符有:

字符 描述
* 匹配前面的子表達(dá)式零次或多次蚕苇。例如,zo* 能匹配 "z" 以及 "zoo"凿叠。* 等價(jià)于{0,}涩笤。
+ 匹配前面的子表達(dá)式一次或多次嚼吞。例如,'zo+' 能匹配 "zo" 以及 "zoo"蹬碧,但不能匹配 "z"舱禽。+ 等價(jià)于 {1,}。
? 匹配前面的子表達(dá)式零次或一次恩沽。例如誊稚,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價(jià)于 {0,1}罗心。
{n} n 是一個(gè)非負(fù)整數(shù)里伯。匹配確定的 n 次。例如渤闷,'o{2}' 不能匹配 "Bob" 中的 'o'疾瓮,但是能匹配 "food" 中的兩個(gè) o。
{n,} n 是一個(gè)非負(fù)整數(shù)飒箭。至少匹配n 次狼电。例如,'o{2,}' 不能匹配 "Bob" 中的 'o'补憾,但能匹配 "foooood" 中的所有 o漫萄。'o{1,}' 等價(jià)于 'o+'。'o{0,}' 則等價(jià)于 'o*'盈匾。
{n,m} m 和 n 均為非負(fù)整數(shù)腾务,其中n <= m。最少匹配 n 次且最多匹配 m 次削饵。例如岩瘦,"o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o。'o{0,1}' 等價(jià)于 'o?'窿撬。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格启昧。

定位符

定位符使您能夠?qū)⒄齽t表達(dá)式固定到行首或行尾。它們還使您能夠創(chuàng)建這樣的正則表達(dá)式劈伴,這些正則表達(dá)式出現(xiàn)在一個(gè)單詞內(nèi)密末、在一個(gè)單詞的開頭或者一個(gè)單詞的結(jié)尾。

定位符用來描述字符串或單詞的邊界跛璧,^ 和 $ 分別指字符串的開始與結(jié)束严里,span class="marked">\b 描述單詞的前或后邊界,span class="marked">\B 表示非單詞邊界追城。

正則表達(dá)式的限定符有:

字符 描述
^ 匹配輸入字符串開始的位置刹碾。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 還會(huì)與 \n 或 \r 之后的位置匹配座柱。
$ 匹配輸入字符串結(jié)尾的位置迷帜。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性物舒,$ 還會(huì)與 \n 或 \r 之前的位置匹配。
\b 匹配一個(gè)字邊界戏锹,即字與空格間的位置冠胯。
\B 非字邊界匹配。
\d 表示數(shù)字景用。
\D 表示非數(shù)字涵叮。
\s 表示空格。
\S 表示非空格伞插。
\w 表示所有字母割粮、數(shù)字和下劃線。
\W 表示非所有字母媚污、數(shù)字和下劃線舀瓢。

注意:不能將限定符與定位點(diǎn)一起使用。由于在緊靠換行或者字邊界的前面或后面不能有一個(gè)以上位置耗美,因此不允許諸如 ^* 之類的表達(dá)式京髓。

若要匹配一行文本開始處的文本,請(qǐng)?jiān)谡齽t表達(dá)式的開始使用 ^ 字符商架。不要將 ^ 的這種用法與中括號(hào)表達(dá)式內(nèi)的用法混淆堰怨。

若要匹配一行文本的結(jié)束處的文本,請(qǐng)?jiān)谡齽t表達(dá)式的結(jié)束處使用 $ 字符蛇摸。

若要在搜索章節(jié)標(biāo)題時(shí)使用定位點(diǎn)备图,下面的正則表達(dá)式匹配一個(gè)章節(jié)標(biāo)題,該標(biāo)題只包含兩個(gè)尾隨數(shù)字赶袄,并且出現(xiàn)在行首揽涮。

注:[]里包含的是內(nèi)容,且只能是一個(gè)字符/空格饿肺;{}里包含的指定字符的個(gè)數(shù)蒋困。


回顧正則表達(dá)式

術(shù)語:字符組、排除型字符組敬辣、多選結(jié)構(gòu)雪标、反向引用、或與
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線或漢字 等價(jià)于 ‘[A-Za-z0-9_]’(注:
\w能不能匹配漢字要視你的操作系統(tǒng)和你的應(yīng)用環(huán)境而定)
\W '\w'取反
\s 匹配任意的空白符
\S '\s'取反
\d 匹配數(shù)字
\D '\d'取反
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束
? 表示0個(gè)或1個(gè)
+ 表示重復(fù)一次或者多次
* 表示重復(fù)零次或者多次
{n,m} 表示n 到 m 次

  • 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
如:Jeffs is a person. 匹配==>`\bJeff(?=s\b)`
前瞻
  • 后顧:
(?<=exp2)exp1 查找exp2后面的exp1
  • 負(fù)前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
  • 負(fù)后顧:
(?<!=exp2)exp1 查找前面不是exp2的exp1

1溉跃、“字符組”示例
字符組

2汰聋、“或”示例

3、“非”示例

補(bǔ)充
圖片.png
特殊字符匹配本身需要轉(zhuǎn)義
謂詞語法總覽
謂詞語法總覽
"="的使用
"&&"喊积、">"和"<"的使用

拓展
還可以查看正則表達(dá)式(入門)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玄妈,一起剝皮案震驚了整個(gè)濱河市乾吻,隨后出現(xiàn)的幾起案子髓梅,更是在濱河造成了極大的恐慌,老刑警劉巖绎签,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枯饿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡诡必,警方通過查閱死者的電腦和手機(jī)奢方,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爸舒,“玉大人蟋字,你說我怎么就攤上這事∨っ悖” “怎么了鹊奖?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涂炎。 經(jīng)常有香客問我忠聚,道長(zhǎng),這世上最難降的妖魔是什么唱捣? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任两蟀,我火速辦了婚禮,結(jié)果婚禮上震缭,老公的妹妹穿的比我還像新娘赂毯。我一直安慰自己,他們只是感情好蛀序,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布欢瞪。 她就那樣靜靜地躺著,像睡著了一般徐裸。 火紅的嫁衣襯著肌膚如雪遣鼓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天重贺,我揣著相機(jī)與錄音骑祟,去河邊找鬼。 笑死气笙,一個(gè)胖子當(dāng)著我的面吹牛次企,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潜圃,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缸棵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了谭期?” 一聲冷哼從身側(cè)響起堵第,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吧凉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后踏志,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阀捅,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年针余,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饲鄙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圆雁,死狀恐怖忍级,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摸柄,我是刑警寧澤颤练,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站驱负,受9級(jí)特大地震影響嗦玖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跃脊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一宇挫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酪术,春花似錦器瘪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庐舟,卻和暖如春欣除,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挪略。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工历帚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杠娱。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓挽牢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親摊求。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禽拔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容