4

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

我可以在类中创建一个主要方法并调试正则表达式(?<=\\().+?(?=\\){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;
}

发生了什么导致它在应用程序中编译,但在 web 应用程序中不起作用?

编辑:

使用任何字符串都会失败,但当前检查的字符串是:“(Group Camp Renovation)”

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

4

2 回答 2

6

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

当您(?<=\\().+?(?=\\){1})像这样粘贴字符串时:

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

你会得到这个输出

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

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

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

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

将打印

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

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

于 2013-05-31T11:04:20.760 回答
0

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

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

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

于 2013-05-31T10:55:24.427 回答