1. 程式人生 > >正則表示式某些元字元的理解,基於js

正則表示式某些元字元的理解,基於js

正則表示式的字元描述,網上一搜一大堆,但是由於只有描述而沒有具體例子,讓人感覺還是有些模糊。

於是,我整理了一些比較不容易理解的字元的具體例子,加深理解。

先打個基礎吧:

正則表示式中的元字元可以分為兩種:匹配位置和匹配字元的元字元。

匹配位置的元字元:顧名思義就是設定要匹配的字串的位置,匹配的是一個位置而不是一個字元。包括3種:^、$、\b。

匹配字元的元字元:通常只能匹配字串集合中的一個字元。包括:. 、\w、\W、\s、\S、\d、\D  這7種。

( ):用於分組,分組又稱子表示式。分組後將()內的表示式看做一個整體。也就是如果後接下面的限定符,即可對整個()內匹配多次。

(exp)這種形式又稱捕獲,即

匹配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’