码迷,mamicode.com
首页 > 其他好文 > 详细

外文翻译——正则表达式(5)——字符集合与范围

时间:2016-08-02 15:17:02      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

本文章翻译自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( "alice15@gmail.com", /[^\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 (, ), -, ^

 

外文翻译——正则表达式(5)——字符集合与范围

标签:

原文地址:http://www.cnblogs.com/zysos2016/p/5728410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!