在正则表达式中小括号的应用种类比较多,差别也很大

主要使用的有下面三种:

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:"字符串。