1.简介
JAVA中REGEXP的非捕获组为(?)开头的组,包含以下8种
1)(?:X) X,作为非捕获组
与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本,
仅仅作为分组。
比如:要匹配 123123 这个,就可以写为 (123)\1 使用反向引用,这时只能用捕获组,在匹配
123 后会保留在内存中,便于反向引用,而 (?:123) 在匹配完后则不会保留,区别仅在于此。
2)(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off
用于标志匹配,比如:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配
不区分大小地进行匹配,(?-i) 关闭标志,恢复不区分大小写,这时的 def 只能匹配 def
3)(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def)
4)(?=X) X,通过零宽度的正 lookahead
5)(?!X) X,通过零宽度的负 lookahead
(?=X) 表示当前位置(即字符的缝隙)后面允许出现的字符,比如:表示式 a(?=b),在字符串为
ab 时,可能匹配 a,后面的 (?=b) 表示,a 后面的缝隙,可以看作是零宽度。
(?!X) 表示当前位置后面不允许出现的字符
6)(? <=X) X,通过零宽度的正 lookbehind
7)(? <!X) X,通过零宽度的负 lookbehind
这两个与上面两个类似,上面两个是向后看,这个是向前看,即前面可以出现的字符
8)(?>X) X,作为独立的非捕获组
匹配成功不进行回溯,这个比较复杂,也侵占量词“+”可以通用,比如:\d++ 可以写为 (?>\d+)。
http://www.regular-expressions.info/atomic.html
其中说的示例:来看 /\b(integer|insert|in)\b/ 匹配 integers 过程,第一个,当integer\b匹配到s时失败,然后字符串(integers)会回溯到i,再接着第二个(insert)去匹配。而把模式写成 /\b(?>integer|insert|in)\b/ 在刚才的第一个匹配失败,字符串(integers)不会回溯了,也不会有第二个去匹配了,所有速度会快一点点。
但是写 (?>X) 这种式子时要注意,是从左到右看的。/\b(?>integer|insert|in)\b/ ,与 /\b(?>in|integer|insert)\b/ 去匹配 insert,结果会不一样,前者可以匹配到,后者不能,什么原因自己分析下。一但匹配失败就会跳过,所以应该长的写在表达式前面。
2.源代码
package com.siyuan.jdktest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExpTest {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("------------------------------");
Pattern pattern1 = Pattern.compile("(?:123)"); //1)
Matcher matcher1 = pattern1.matcher("123");
System.out.println(matcher1.matches());
System.out.println(matcher1.group(0));
// System.out.println(matcher1.group(1)); //ERROR
System.out.println("------------------------------");
// Pattern pattern2 = Pattern.compile("(?i)abc(?-i)def"); //2)
Pattern pattern2 = Pattern.compile("(?i:abc)(?-i:def)"); //3)
Matcher matcher2 = pattern2.matcher("abcdef"); //true
// Matcher matcher2 = pattern2.matcher("ABCdef"); //true
// Matcher matcher2 = pattern2.matcher("abcDEF"); //false
System.out.println(matcher2.matches());
System.out.println(matcher2.group(0));
// System.out.println(matcher2.group(1));//ERROR
// System.out.println(matcher2.group(2));//ERROR
System.out.println("------------------------------");
// Pattern pattern3 = Pattern.compile("a(?=b)"); //4)
// Pattern pattern3 = Pattern.compile("a(?!b)"); //5)
// Pattern pattern3 = Pattern.compile("(?<=b)a"); //6)
Pattern pattern3 = Pattern.compile("(?<!b)a"); //7)
String test3 = "aacababaA";
Matcher matcher3 = pattern3.matcher(test3);
while (matcher3.find()) {
System.out.println("-------------------");
System.out.println(matcher3.group());
System.out.println(matcher3.start());
}
System.out.println("------------------------------");
Pattern pattern4 = Pattern.compile("(?>integer|insert|in)"); //8)
// Pattern pattern4 = Pattern.compile("\\b(?>integer|insert|in)\\b"); //8)
// Pattern pattern4 = Pattern.compile("\\b(?>in|integer|insert)\\b"); //8)
// Pattern pattern4 = Pattern.compile("\\b(?>insert|integer|in)\\b"); //8)
String test4 = "insert";
Matcher matcher4 = pattern4.matcher(test4);
while (matcher4.find()) {
System.out.println("-------------------");
System.out.println(matcher4.group());
System.out.println(matcher4.start());
}
}
}
3.运行结果
------------------------------
true
123
------------------------------
true
abcdef
------------------------------
-------------------
a
0
-------------------
a
1
-------------------
a
3
------------------------------
-------------------
insert
0
4.参考资料
http://hi.baidu.com/victorlin23/blog/item/289cfc4333310c199213c615.html
分享到:
相关推荐
named-regexp, Java 5/6 正规表达式的命名捕获组 命名正则表达式 这个轻量级库增加了 5/6 ( 在Android上) 中命名为捕获组( )的支持。这是来自( 当前处于非活动状态)的名为regexp的的fork的。用法可以以使用( 。例如...
以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...
您可以对Java 7中的命名捕获组使用相同的构造(即(?<name>patt)等),如以下示例所示: import com.google.code.regexp.Pattern ; import com.google.code.regexp.Matcher ; public class NamedRegexpTest { ...
JAVA正则表达式语法(转)正则表达式语法正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式示例表达式 ...
特征: - Excel,CSV和JSON导出 - 配方创造者 - 源代码“指南”集成到配方创建中 - Regexp Ready,包括字符提取和布尔的存在测试 - 标准和非标准属性分析和提取 - 自定义文本隔离并在两个固定点之间捕获 - Ajax事件...
string 对象 1、str.match(RegExp) 在str中搜索匹配RegExp的字符串并保存在一个数组内返回, 如果RegExp不是全局设置(/g),仅匹配一次 代码如下: (“abc112dwfwabcwef2abc3wfwabcasqf453abcqwf24j234h”).match(/abc...
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,...
对( ) 这样的特殊符号,应该用\( \)来表示,这也是很标准的regexp语法,可以写为 <script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH\('93163607', '728', '90'\);\n//-->\n</SCRIPT>\n 【5】正则表达式应用——...
对( ) 这样的特殊符号,应该用\( \)来表示,这也是很标准的regexp语法,可以写为 <script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH\('93163607', '728', '90'\);\n//-->\n</SCRIPT>\n 【5】正则表达式应用——...
【14】工具集成——编译器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis、C#) 【15】工具集成——让Editplus调试PHP程序———————-avenger,aukw 【16】工具集成——打造 PHP 调试环境(二)——...
我一直使自己在很大程度上保持着一个Tcl程序员的角色,而我们工作组中的其他人员则埋头于Tcl本身的C语言实现。我创建的应用程序有HTML编辑器、EMAIL比用户接口程序、Web服务器以及用户数据库,我们的商务应用就建立...
若找到,返回1个数组,数组的每个元素是每个找到的匹配关键 | |--str.replace(regExp,"替换值")--替换str中所有匹配的关键字 | 强调:replace方法不改变元字符串,只能返回新字符串。必须用变量接收新字符串 | |-...
第 1 章 JavaScript 是什么...............................................1 3 1.1 历史简述..............................................1 1.2 JavaScript 实现................................................