我有一个运行的服务,它使用发送给它的正则表达式并使用它从字符串中检索值。
我可以在类中创建一个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调用时,它会抛出异常。
答案 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
接收错误信息中的字符串。