標籤:
本文章翻譯自Ilya Kantor所寫的JavaScript Tutorial。轉載需遵守CC BY-NC-SA協議。
原文地址:http://javascript.info/tutorial/regexp-introduction
字元集合與範圍
幾個字元或者字元類可以用方括弧"[...]"包起來,用來匹配其中之一。
例如,[eao]是指匹配"e","a"和"o"中的任意一個字母。也就是列表中的單一字元。
1 showMatch( "The OGRE on green grass!", /gr[eao]/gi ) // "GRE", "gre", "gra"
上例中,"gr[eao]"匹配了"gre"而不是"gree",因為"[eao]"只代表其中一個單一字元。
時間可以用:hour:minute或者hour-minute表示,無論是hour還是minute都是兩個數字:
09:00 21-30
寫一個正則式來匹配"Breakfast at 09:00. Dinner at 21-30."中的所有時間。
1 showMatch( "Breakfast at 09:00. Dinner at 21-30.", /\d\d[-:]\d\d/g )
注意在字元集合中,虛線"-"沒有被轉義,因為在這兒它並不是特殊字元。
修飾符"g"表示需要全域匹配而不是只返回第一個匹配值。
方括弧還可以包含字元範圍。例如"[a-z]"表示從a到z的其中一個字母,"[0-5]"則表示從0到5的其中一個數字。
1 showMatch( "Exception 0xAF", /x[A-F]/g ) // matches "xA", not "xc"
上面的例子中,並沒有匹配到"Exception"中的"xc",因為在字元範圍中只包含了大寫字母,而且並未使用"i"修飾符。
正則式匹配了"xA"而不是"xAF",因為"[A-F]"只表示從"A"到"F"中的其中一個字元。
字元,字元類,以及字元集合可以被放在一起。
以下例子尋找"a-f","A-F"中的其中一個字元,或者"x"亦或一個數字。
1 showMatch( "look -> 0xAF", /[\dA-Fa-fx]/g ) // "0", "x", "A", "F"
絕大部分字元類實際上就是對字元集合的縮寫,例如:
- "\d"等同於"[0-9]",
- "\w"等同於"[a-zA-Z0-9_]",
- "\s"等同於"[\t\n\v\f\r ]"加上幾個unicode空格符號。
同樣的,還有反字元範圍:"[^...]"。
方括弧中以脫字元開始"[^...]"將匹配除了給定範圍外的所有字元。
例如:
- [^aeou]:匹配除"a","e","o","u"以外的所有字元
- [^0-9]:匹配所有非數字,等同於"\D"
- [^\s]:匹配所有非空格,等同於"\S"
跟一般字元範圍一樣,反字元範圍也可以包含多個字元和範圍。下面例子將匹配非字母,非數字和非空格:
1 showMatch( "[email protected]", /[^\d\sA-Z]/gi ) // "@", "."
"sock"中可以匹配到參數"k[^s]"嗎?
上例中的正則式需要匹配字元"k",且後面跟著字母s以外任何字元。
但是在"sock"中,字元"k"後面沒有其他字元,所以沒有匹配結果。
一個字元集合"[...]"必須要匹配一個字元,無論它是否被倒置。
大部分特殊字元放在方括弧中是不需要轉義的。
在方括弧中,你只需要轉義右方括弧"]"和反斜線"\"。
其他特殊字元只在有特殊意義的時候才需要轉義:
- 連字號"-"只在位於兩個符號中間時,才需要轉義。如果是放在首位或者末尾,那麼就不是表示一個範圍,所以就不需要轉義;
- 脫字元"^"只在位於首位時才需要被轉義"[\^..]";
- 其他字元,包括點號".",加號"+",圓括弧"()",左方括弧"["等出現的時候都無需轉義。
如果你看看周圍大多數正則式代碼,特殊字元無論在正則式中的哪個位置,通常都被轉義了。
但是方括弧卻允許移除轉義,以此讓代碼變得更具可讀性。
例如,正則式"[-().^]"字面上的意思是匹配"-().^"中的其中一個字元。這個正則式中的特殊字元沒有特殊含義。
1 var re = /[-().^]/g2 3 showMatch( "f(g)-^1", re ) // matches (, ), -, ^
所以,從技術層面來說,可以在方括弧中省略多餘的斜杠。但是如果你加了斜杠也依然能正確輸出匹配結果。
1 var re = /[\-\(\)\.\^]/g 2 3 showMatch( "f(g)-^1", re ) // matches same (, ), -, ^
外文翻譯——Regex(5)——字元集合與範圍