日期:2014-05-20  浏览次数:20775 次

问个正则的问题
刚才在一个帖子中看到(?=X)这样的正则表达式,jdk文档中说这是X,通过零宽度的正 lookahead,我表示不是很明白,希望有高手能讲解一下,最好举个例子说明一下,谢谢了

------解决方案--------------------
搜索 肯定顺序环视
------解决方案--------------------
探讨

搜索 肯定顺序环视

------解决方案--------------------
import java.util.regex.Matcher;
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();
}

}