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

本文章翻译自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 (, ), -, ^
时间: 2024-10-29 01:23:31

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

外文翻译——正则表达式(7)——量词+, * 和?

量词+, * 和? 一些被广泛使用的缩写量词"+","*"和"?". 基本上,它们都是数量词的简写: "+" 表示“大于等于一个”,等同于"{1,}". 例如:"\d+"匹配一个任意长度的数字: 1 showMatch( "number 12345", /\d+/ ) // 12345 "?" 表示“零个或一个”,等同于"{0,1}&qu

正则表达式的字符组取反(负值字符集合/范围)^必须出现在起始位置

今天发现[?^a]匹配的匹配的是:?^a,心想^a不是字符组取反吗?难道[?]是新语法? 最后才注意到字符组取反(负值字符集合/范围)的语法规则: 对于字符组取反(负值字符集合/范围),^必须出现在起始位置. 如[^a],意为匹配除a外的所有字符,但若是[#^a],它就不是字符组取反了--而仅仅是一个普通的字符组,意为匹配#^a 在<学习正则表达式>一书中有此规定的表述:

正则表达式所有字符解释

在下载平台使用中往往需要较精确的正则表达式去匹配,下面对正则表达式所有字符具体解释 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后 引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个 换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 "(". ^ 匹配输入字符串的开始位置.如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的

正则表达式的字符含义

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的. 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 3.1 普通字符 由所有那些未显式指定为元字符的

正则表达式各个字符的解释

正则表达式作为简单快速匹配性的字符式在程序开发中不可缺少的一位,会点简单的正则表达式可以让你少些很多代码,何乐而不为呢? 作为一个程序员如果说不会正则真的有点说不过去了,好了废话不多说了看解释 常用的一些个正则表达式参考在下边这个链接里面,这里就不写在一起了 http://www.cnblogs.com/lizhanqi/p/5906143.html 正则表达式字符介绍:详细的可见维基百科介绍 //常用字符的使用介绍 在正则表达式中 \ 的意思是代表转义字符 在正则表达式中 . 的意思是代表任意

正则表达式的字符的简单表示

元字符 描述 \ 将下一个字符标记符.或一个向后引用.或一个八进制转义符.例如,"\\n"匹配\n."\n"匹配换行符.序列"\\"匹配"\"而"\("则匹配"(".即相当于多种编程语言中都有的"转义字符"的概念. ^ 匹配输入字符串的开始位置.如果设置了RegExp对象的Multiline属性,^也匹配"\n"或"\r"之后的

js正则表达式常用字符

啥是正则表达式? 一个正则表达式(regular expression)就是包含正常字符串和特殊元字符(meta characters)或元序列(meta sequences)的字符串.正常字符串匹配它们自己.元字符和元序列是字符或表示数量.位置或字符类型的字符序列. 这里只是记录一下学习过程,学习请转JS正则表达式详情 常用的正则字符 1.\ : 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'n' 匹配一个换行

go mysql 报错-表的字符集和代码链接的字符集合不同

go mysql rserr := db.Exec(s[]s[]s[]floatNumfloatNum2) Error 1366: Incorrect string value: '\xE7\x9B\x92\xE5\xB8\x81' for column 'word' at row 1 表的字符集和代码链接的字符集合不同

华为2016研发工程师编程题:字符集合

字符集合 输入一个字符串,求出该字符串包含的字符集合 输入描述: 每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写. 输出描述: 每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出. 输入例子: abcqweracb 输出例子: abcqwer 解题 标记法时间复杂度太差了,可以用HashMap增加了空间复杂度 我的标记法 import java.util.Scanner; public class Main{ public s