刚才在一个帖子中看到(?=X)这样的正则表达式,jdk文档中说这是X,通过零宽度的正 lookahead,我表示不是很明白,希望有高手能讲解一下,最好举个例子说明一下,谢谢了
解决方案 »
- 最近遇到两个知名公司的面试问题(各位帮看看回答下)
- JAVASCRIPT在图片中取一个坐标点,鼠标点住左键拉伸一定区域,我想要得到这个点的坐标x,y值,还有拉伸一定区域的长,宽值。哪位js高手帮我看看怎么弄
- ?哪个类呢
- 嵌套类的问题. 谢谢.
- 请问一个String[]如何转换成List?
- 请教如何入门
- 请问volatile这个关键字是什么意思啊?
- 如何用树行目录显示磁盘文件
- 谁能为我指点指点——在notes开发中对notes文档和非notes文档的检索怎样解决?急!!!
- 如何得到所有的“水仙花数”?
- 杨辉三角问题2
- eclipse 中的text file encoding 中的UTF-8 与 GBK 有什么区别??
import java.util.regex.Pattern;
/**
* 正则表达式非捕获组
* 特殊构造(非捕获) (JDK API说明)
* 1.(?:X) X,作为非捕获组
* 2.(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off
* 3.(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
* 4.(?=X) X,通过零宽度的正 lookahead
* 5.(?!X) X,通过零宽度的负 lookahead
* 6.(?<=X) X,通过零宽度的正 lookbehind
* 7.(?<!X) X,通过零宽度的负 lookbehind
* 8.(?>X) X,作为独立的非捕获组
*
*/
public class NonCapturingGroups {
public static void main(String args[]) {
//1.(?:)不记录组号
NonCapturingGroups.testRegExp("(\\d+)(\\.?)(\\d+)([¥$])$", "123.43$", new int[]{1,4});
NonCapturingGroups.testRegExp("(\\d+)(?:\\.?)(?:\\d+)([¥$])$", "123.43$", new int[]{1,2});
//2.3 用于标志匹配,比如:(?i) 打开不区分大小写开关;(?-i) 关闭标志,恢复不区分大小写
// 正则可改写成:(?i:abc)def 或者 (?i)abc(?-i:def)
// 没有(?-1)时,没有关闭,可匹配AbcDef
// NonCapturingGroups.testRegExp("(?i)abc(?-i)def", "Abcdef");
//4.5 !为=取反
//(?=) 在前面,输出ba, 4--6. 表示以b开头,结果集中包含b
// 试试(?=b)a, 永远无输出
// NonCapturingGroups.testRegExp(".{2}(?=b)", "aacabaaqq");
//(?=) 在后面,输出ac, 2--4. 表示以2字符后面紧跟b,不捕获b
// NonCapturingGroups.testRegExp(".{2}(?=b)", "aacabaaqq");
// NonCapturingGroups.testRegExp(".{2}(?=b).{2}", "aacabaaqq");
//6.7
// lookahead: 前面紧跟 ; lookbehind: 后面紧跟
// NonCapturingGroups.testRegExp(".{2}(?=b)", "aacabaaqq");
// NonCapturingGroups.testRegExp(".{2}(?<=b)", "aacabaaqq");
// NonCapturingGroups.testRegExp(".{2}(?=b).{2}", "aacabaaqq"); //获取b前紧跟2字符
// NonCapturingGroups.testRegExp(".{2}(?<=b).{2}", "aacabaaqq"); // 获取b后紧跟2字符
//8.(?>) 匹配失败,跳过
// NonCapturingGroups.testRegExp("a(bc|b)c", "abc");
// NonCapturingGroups.testRegExp("a(?>bc|b)c", "abc");
}
/**
* @param regExp: 正则表达式
* @param resource: 源字符串
*/
public static void testRegExp(String regExp, String resource) {
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(resource);
int count = 0;
while(m.find()) {
count ++;
System.out.println(m.group());
System.out.println(m.start() + "---" + m.end());
}
if(count == 0)
System.out.println("not find");
}
/**
* @param regExp: 正则表达式
* @param resource: 源字符串
* @param groups: 输出组号
*/
public static void testRegExp(String regExp, String resource, int[] groups) {
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(resource);
while(m.find()) {
if(null == groups)
groups = new int[]{0};
for(int i=0; i<groups.length; i++) {
System.out.print(m.group(groups[i]));
}
System.out.println();
}
}
}