本文章翻译自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 = /[-().^]/g 2 3 showMatch( "f(g)-^1", re ) // matches (, ), -, ^
所以,从技术层面来说,可以在方括号中省略多余的斜杠。但是如果你加了斜杠也依然能正确输出匹配结果。
1 var re = /[\-\(\)\.\^]/g 2 3 showMatch( "f(g)-^1", re ) // matches same (, ), -, ^