正則表示式某些元字元的理解,基於js
正則表示式的字元描述,網上一搜一大堆,但是由於只有描述而沒有具體例子,讓人感覺還是有些模糊。
於是,我整理了一些比較不容易理解的字元的具體例子,加深理解。
先打個基礎吧:
正則表示式中的元字元可以分為兩種:匹配位置和匹配字元的元字元。
匹配位置的元字元:顧名思義就是設定要匹配的字串的位置,匹配的是一個位置而不是一個字元。包括3種:^、$、\b。
匹配字元的元字元:通常只能匹配字串集合中的一個字元。包括:. 、\w、\W、\s、\S、\d、\D 這7種。
( ):用於分組,分組又稱子表示式。分組後將()內的表示式看做一個整體。也就是如果後接下面的限定符,即可對整個()內匹配多次。
(exp)這種形式又稱捕獲,即
另外,當被分組後,每個組自動有一個組號(從1開始)。該組號代表該組的表示式。\分組號 表示引用該分組。
如(\d)\d\1 這裡的"\1"就是對"(\d)"的後向引用。
[ ]:表示一個字元組(有的書上寫字元類),表示匹配方括號中的任意一個。也就是隻佔一個字元的位置。
{n}表示重複匹配n次、{n,}至少匹配n次、{n,m}表示匹配n到m次
限定符:上面說過元字元只能匹配一個位置或一個字元,要匹配多次需要用限定符。也就是說限定符可以指定特定字元或字符集匹配多少次。
包括但不限於:{n}、{n,}、{n,m}、+、?、*等等。
注意:只指定前面的一個字元
或者字符集(即上面的分組()中的內容)。
1、^
用法1:匹配輸入的開始。如果多行標誌被設定為true,那麼也匹配換行符後緊跟的位置。
換句話說,只有在最開始(索引為0)搜尋到匹配項才算,而[1]以後搜尋到就不行。
例如:^string 表示匹配以string開頭的行。
js例子如下:
var p=/^a/g;
p.test('apple'); //true
p.exec('parent'); //false
用法2:當 ^ 作為第一個字元出現在一個字元集合模式時,表示反義。
即:[^]表示不包含,預設是一個字元長度。
例如:[^xyz]它匹配任何一個沒有包含在方括號中的字元。注意這裡[^xyz]只佔1位,即除xyz的任意一個字元。
如下:
var l=/[^xyz]/g;
l.exec('apple'); //獲得陣列["a", index: 0, input: "apple"]
l.exec('apple'); //再次呼叫得["p", index: 1, input: "apple"]
注:因為var l的是g模式,所以再次呼叫exec()方法是從前一個被發現的匹配項以後搜尋。
2、$
用法:匹配輸入的結束。如果多行標示被設定為true,那麼也匹配換行符前的位置。
例如,/t$/ 並不會匹配 "eater" 中的 't',但是會匹配 "eat" 中的 't'。
即/string$/表示一定要匹配末尾是string的匹配項。
var m=/ple$/g;
m.exec('apple'); //["ple", index: 2, input: "apple"]
3、?
用法1:匹配前面一個表示式0次或者1次。等價於 {0,1}。
例如:colou?r : u?表示匹配前一個字元 0到1次。整體表示匹配colour或color。
用法2:在限定符*、+、{}、?後接?,表示非貪婪模式,即儘可能少的匹配。
"*?" 重複任意次,但儘可能少重複
如 "acbacb" 正則 "a.*?b" 只會取到第一個"acb" 原本可以全部取到但加了限定符後,只會匹配儘可能少的字元 ,而"acbacb"最少字元的結果就 是"acb"
"+?" 重複1次或更多次,但儘可能少重複
與上面一樣,只是至少要重複1次
"??" 重複0次或1次,但儘可能少重複
如 "aaacb" 正則 "a.??b" 只會取到最後的三個字元"acb"
"{n,m}?" 重複n到m次,但儘可能少重複
如 "aaaaaaaa" 正則 "a{0,m}" 因為最少是0次所以取到結果為空
"{n,}?" 重複n次以上,但儘可能少重複
如 "aaaaaaa" 正則 "a{1,}" 最少是1次所以取到結果為 "a"
用法3:用於分組中:
(?:x)表示匹配 'x' 但是不記住匹配項。這種叫作非捕獲括號,使得你能夠定義為與正則表示式運算子一起使用的子表示式。
例如:/(?:foo){1,2}/。如果表示式是 /foo{1,2}/,{1,2}將只對 ‘foo’ 的最後一個字元 ’o‘ 生效。如果使用非捕獲括號,則{1,2}會匹配整個 ‘foo’ 單詞。
x(?=y) 匹配'x'僅僅當'x'後面跟著'y'.這種叫做正向肯定查詢。
例如,/Jack(?=Sprat)/會匹配到'Jack'僅僅當它後面跟著'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’僅僅當它後面跟著'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配結果的一部分。
x(?!y) 匹配'x'僅僅當'x'後面不跟著'y',這個叫做正向否定查詢。
例如,/\d+(?!\.)/匹配一個數字僅僅當這個數字後面沒有跟小數點的時候。正則表示式/\d+(?!\.)/.exec("3.141")匹配‘141’但是不是‘3.141’