斷言 :表示一個匹配在某些條件下發(fā)生。斷言包含先行斷言、后行斷言和條件表達(dá)式。
字符類 :區(qū)分不同類型的字符,例如區(qū)分字母和數(shù)字。
組和范圍:表示表達(dá)式字符的分組和范圍。
量詞 :表示匹配的字符或表達(dá)式的數(shù)量。
UniCode轉(zhuǎn)義 :基于 unicode 字符屬性區(qū)分字符。例如大寫和小寫字母、數(shù)學(xué)符號和標(biāo)點(diǎn)。
? 非貪婪 、貪婪模式 ;
如果?緊跟在任何量詞 *、 +、? 或 {} 的后面,將會使量詞變?yōu)榉秦澙罚ㄆヅ浔M量少的字符),和缺省使用的貪婪模式(匹配盡可能多的字符)正好相反。例如,對 "123abc" 使用 /\d+/ 將會匹配 "123"(貪婪模式),而使用 /\d+?/ 則只會匹配到 "1" (非貪婪模式)。
(x)
括號,它在正則表達(dá)式中常用作記憶設(shè)備。即這部分所匹配的字符將會被記住以備后續(xù)使用
其中括號被稱為捕獲括號。
模式/(foo) (bar) \1 \2/
中的 '(foo)
' 和 '(bar)
' 匹配并記住字符串 "foo bar foo bar" 中前兩個單詞。模式中的\1
和\2
表示第一個和第二個被捕獲括號匹配的子字符串,即foo
和bar
,匹配了原字符串中的后兩個單詞。注意\1
、\2
、...、\n
是用在正則表達(dá)式的匹配環(huán)節(jié),詳情可以參閱后文的 \n 條目。而在正則表達(dá)式的替換環(huán)節(jié),則要使用像$1
、$2
、...、$n
這樣的語法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')
。$&
表示整個用于匹配的原字符串。
image.png
交換字符串位置 demo
image.png
x(?=y) 匹配'x'僅僅當(dāng)'x'后面跟著'y'.這種叫做先行斷言
例如,/Jack(?=Sprat)/會匹配到'Jack'僅當(dāng)它后面跟著'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’僅當(dāng)它后面跟著'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配結(jié)果的一部分。
(?<=y)x 匹配'x'僅當(dāng)'x'前面是'y'.這種叫做后行斷言。
例如,/(?<=Jack)Sprat/會匹配到' Sprat '僅僅當(dāng)它前面是' Jack '。/(?<=Jack|Tom)Sprat/匹配‘ Sprat ’僅僅當(dāng)它前面是'Jack'或者是‘Tom’。但是‘Jack’和‘Tom’都不是匹配結(jié)果的一部分。
x(?!y) 僅僅當(dāng)'x'后面不跟著'y'時匹配'x',這被稱為正向否定查找。
例如,僅僅當(dāng)這個數(shù)字后面沒有跟小數(shù)點(diǎn)的時候,/\d+(?!.)/ 匹配一個數(shù)字。正則表達(dá)式/\d+(?!.)/.exec("3.141")匹配‘141’而不是‘3.141’
(?<!y)x 僅僅當(dāng)'x'前面不是'y'時匹配'x',這被稱為反向否定查找。
例如, 僅僅當(dāng)這個數(shù)字前面沒有負(fù)號的時候,/(?<!-)\d+/ 匹配一個數(shù)字。
/(?<!-)\d+/.exec('3') 匹配到 "3".
/(?<!-)\d+/.exec('-3') 因為這個數(shù)字前有負(fù)號,所以沒有匹配到。