Lookahead正则表达式产生意想不到的组

时间:2010-06-03 14:01:35

标签: java regex

我正在尝试从不应包含.html的网址中提取网页名称和查询字符串

以下是Java中的示例代码:

public class TestRegex { 
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("/test/(((?!\\.html).)+)\\?(.+)");
        Matcher matcher = pattern.matcher("/test/page?param=value");
        System.out.println(matcher.matches());
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
    }
}

通过运行此代码,可以获得以下输出:

  


  页面
  ë

我的正则表达式有什么问题,所以第二组包含字母e而不是param=value

1 个答案:

答案 0 :(得分:3)

你在做:

Pattern.compile("/test/(((?!\\.html).)+)\\?(.+)")
//                     ^^            ^ ^   ^  ^
//                     ||            | |   |  |
//                     |+------2-----+ |   +-3+
//                     |               |  
//                     +-------1-------+                  

尝试:

Pattern.compile("/test/((?:(?!\\.html).)+)\\?(.+)")
//                     ^                 ^   ^  ^
//                     |                 |   |  |
//                     |                 |   +-2+
//                     |                 |  
//                     +--------1--------+  

换句话说:(?:...)使其成为非捕获组。