Java Regex:看后面的组没有“明显的最大长度”

时间:2013-05-31 10:34:06

标签: java regex quoting

我有一个运行的服务,它使用发送给它的正则表达式并使用它从字符串中检索值。

我可以在类中创建一个main方法并调试正则表达式(?<=\\().+?(?=\\){1}),它可以很好地工作。

但是,只要我在tomcat中部署它以进行远程测试,我就会遇到以下异常:

Look-behind group does not have an obvious maximum length near index 19
(?<=\\().+?(?=\\){1})
                   ^

这是解析被调用的值的函数:

private String parsePattern(String value, String pattern)
{
    String ret = "";

    Matcher m = Pattern.compile(pattern).matcher(value);
    while (m.find())
    {
        ret = m.group(0);
    }

    return ret;
}

是什么导致它在应用程序中编译,但无法在webapp中工作?

编辑:

这对任何字符串都失败,但当前正在检查的字符串是:“(Group Camp Renovation)”

main调用时,该方法返回“Group Camp Renovation”,当通过webapp调用时,它会抛出异常。

2 个答案:

答案 0 :(得分:6)

问题是 - 再一次 - 引用Java代码中的字符串与通过某种输入读取时没有引用。

粘贴字符串(?<=\\().+?(?=\\){1})时,如下所示:

String s1 = "(?<=\\().+?(?=\\){1})";
System.out.println(s1);

你会得到这个输出

(?<=\().+?(?=\){1})

这就是正则表达式解析器所看到的。

但是当通过InputStream读取相同的字符串时(仅作为示例),没有任何改变:

String s1 = new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println(s1);

将打印

(?<=\\().+?(?=\\){1})

这意味着{1}归因于(?=\\)部分,而不归因于(?<=部分。

答案 1 :(得分:0)

我已将您的模式输入ideone,结果与您的Tomcat结果相同:

System.out.println("aoeu".matches("(?<=\\\\().+?(?=\\\\){1})"));

注意我如何加倍字符串文字中的所有反斜杠,以便让Pattern.compile接收错误信息中的字符串。