在正则表达式中小括号的应用种类比较多,差别也很大
主要使用的有下面三种:
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:"字符串。
java 正则表达式括号中间的字母 正则表达式括号内内容
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
android 正则表达式 括号 正则表达式括号内内容
正则表达式获取字符串括号内的字符
android 正则表达式 括号