当把!应用到“E!!CFDF#! ,引擎先比较!和
“E ,结果失败了。于是引擎再比较!和“ ,也失败了。直到第四个字符,!匹
配了“! 。匹配了第五个字符。到第六个字符没能匹配“ ,也失败了。引擎
再继续从第五个字符重新检查匹配性。直到第十五个字符开始,!匹配上了“!CF
中的“! ,正则表达式引擎急切的返回第一个匹配的结果,而不会再继续查找是否有其他更好
的匹配。
5. 字符集
字符集是由一对方括号“() 括起来的字符集合。使用字符集,你可以告诉正则表达式引擎仅
仅匹配多个字符中的一个。如果你想匹配一个“ 或一个“ ,使用()。你可以使用
()匹配 或 。这在你不确定你要搜索的字符是采用美国英语还是英国英语
时特别有用。相反,()将不会匹配 或 。字符集中的字符顺序并没有
什么关系,结果都是相同的。
你可以使用连字符“> 定义一个字符范围作为字符集。(9>:)匹配 9 到 : 之间的单个
数字。你可以使用不止一个范围。(9>:>D%>@)匹配单个的十六进制数字,并且大小写
不敏感。你也可以结合范围定义与单个字符定义。(9>:>D%>@G)匹配一个十六进制数
字或字母 G。再次强调一下,字符和范围定义的先后顺序对结果没有影响。
字符集的一些应用
查找一个可能有拼写错误的单词,比如()()或
#(!)(!)。
查找程序语言的标识符,%>H>AI)(%>H>AI9>:)/。1/表示重复 9 或多次2
查找 & 风格的十六进制数9(G)(%>@>D9>:)0。10表示重复一次或多次2
取反字符集
在左方括号“( 后面紧跟一个尖括号“+ ,将会对字符集取反。结果是字符集将匹配任何不
在方括号中的字符。不像“ ,取反字符集是可以匹配回车换行符的。
需要记住的很重要的一点是,取反字符集必须要匹配一个字符。B(+)并不意味着:
匹配一个 B,后面没有 跟着。它意味着:匹配一个 B,后面跟着一个不是 的字符。所以它
不会匹配“JB 中的 B,而会匹配“JB#! 中的 B 和一个空格符。事实上,空格符
是匹配中的一部分,因为它是一个“不是 的字符”。
如果你只想匹配一个 B,条件是 B 后面有一个不是 的字符,我们可以用后面将讲到的向
前查看来解决。