在正则表达式中小括号的应用种类比较多,差别也很大
主要使用的有下面三种: 1. (...) Grouping. Group items into a single unit that can be used with *, +, ?, |, and so on. Also remember the characters that match this group for use with later references. 2. (?:...) Grouping only. Group items into a single unit, but do not remember the characters that match this group. 3. (?=p) A positive lookahead assertion. 或 (?!p) A negative lookahead assertion. 用于测试的字符串:url(skins/default/images/index/default.png) 红色字符为匹配上的结果 第一种,用于普通分组,能记住匹配该分组的字符串,并且可以在以后通过\1的方式来引用所匹配到的分组 eg: (\/)匹配url(skins/default/images/index/default.png) (\/)default\1匹配url(skins/default/images/index/default.png) 第二种,用于分组,不记录匹配该分组的字符串 eg: (?:\/)default匹配url(skins/default/images/index/default.png) 第一、二两种方式匹配的结果里都包含有该分组匹配到的结果,在例子中是"/default"中的"/" 第三种,只用于确定位置,最终结果里并不包含该括号匹配到的结果 eg: (?!\/)default匹配url(skins/default/images/index/default.png) eg: default(?=\/)匹配url(skins/default/images/index/default.png) 正向预查 比如: 有一个字符串: abcdefghi /ab(c)/ 将匹配出来abc 并将c储存到$1 /ab(?:c)/ 将匹配出来abc 并不会将c储存到$1 /ab(?=c)/ 将匹配出来ab,没有匹配出abc,那么c起什么作用呢,限定作用,解释器找到ab后没有马上返回,而是再查查ab后面的是c吗? 如果是c则才返回ab,否则返回匹配失败。看来它预查了c,难怪命名为正向预查。 我个人觉得这个匹配有个替代方法,可以去匹配/(ab)c/,然后通过$1取出ab,我觉得牛的是下面的这个符号! ===== ! ===== 反(逆)向预查 =号变为了!号,!表示非,可见这是一个非操作,这个是否可以解决开始的问题呢? 比如: 有一个字符串: abcdefghi /ab(?=c)/ 将匹配出来后面紧跟着c的ab 推理: /ab(?!c)/ 将匹配出来后面紧跟着不是c的ab,在这个字符串里,将匹配不出结果。 ok, 看看开始的问题是否能否解决。 要获取[后面不是ab的匹配,那么可以使用/\[(?!ab)/来匹配一个后面不是ab的[符号, ok,这个确定后,再去匹配其他任何字符: /\[(?!ab).*?\]/ ok,问题解决。 使用正则式想匹配的字符串中排除一个字符串 ((?!Name:).)* 排除"Name:"字符串。 |
|
来自: Freedom Gundam > 《js》