1)一个字符串,即使是一个排除型字符组,也需要匹配一个字符,如:正则表达式 /e[^q]/ 是不能匹配 apple 这个单词的(在e后面并没有跟换行符的前提下);
2)在字符组里,元字符的定义和意义是完全不一样的,尤其是连字符“-”,在字符组中,它往往用于匹配一个范围,除非它是紧跟在“[”后面的,这里它匹配的就是“-”本身,而不作为范围识别的用途。所以,要切记,在字符组中,如果“-”是作为普通字符而不是元字符进行匹配时,一定要将连字符放在最前面,当然,还有另外一种解决办法是转义,不过这样一来又会增加表达式的复杂度了。所以还是尽量放在前面啦;
关于这个问题的原文摘录:在字符组内部,元字符的定义规则(及它们的意义)是不一样的。例如,在字符组外部,点号是元字符,但是在内部则不是如此。相反,连字符只有在字符组内部(这是普遍情况)才是元字符,否则就不是。脱字符在字符组外部表示一个意思,在字符组内部紧接着“[”时表示另外一个意思,其他情况下又表示别的意思。
3)脱字符“^”在字符组中,则表示不匹配它自己后面紧跟的字符,如果在字符组外,则是从开头处开始匹配的意思;
4)表示重复的元字符“?”、“*”、“+”的异同:
次数下限 | 次数上限 | 说明 | |
---|---|---|---|
? | 0 | 1 | 可以不出现,如果出现最多只能出现一次 |
* | 0 | 无 | 可以出现任意多次 |
+ | 1 | 无 | 至少出现一次,上不封顶 |
5)如果想要在复杂性与完整性之间寻求一个平衡,一个重要的因素是了解清楚待匹配的对象;
6)正则表达式中括号的三种功能:
6.1)限定多选结构的范围; 如:ab(c|d|e)fgh,注意上述写法与去掉括号时 abc|d|efgh 的区别
6.2)标注量词作用的元素;如:ab(cde)+fgh,注意上述写法与去掉括号时 abcde+fhg的区别
6.3)为引用捕获文本;作为这个用法加括号是为了返回或引用匹配结果
7)非捕获型括号:(?:)
8)如果多选分支是有序的,而且能够匹配同样文本的分支不只一个,那就必须要特别注意多个分支的排列次序
9)优化引擎从来不会在字符串开头以外的地方尝试带^锚点的表达式,因为这样可能会严重影响匹配的效率