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

解决方案 »

  1.   

    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();
    }

    }