【问题标题】:Java Regex: Look behind group does not have an "obvious maximum length"Java Regex:看后面组没有“明显的最大长度”
【发布时间】:2023-03-03 17:55:01
【问题描述】:

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

我可以在类中创建一个主方法并调试正则表达式(?<=\\().+?(?=\\){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调用时,抛出异常。

【问题讨论】:

  • Pattern.compile() 从 main 方法运行时与相同的正则表达式完美配合。我知道这是一个运行时异常,我想知道为什么它只在某些情况下抛出。
  • 我希望你没有使用{1},这只是你真正拥有的一个坏例子
  • Pattern.compile() 将不起作用,除非我添加了 {1}
  • @MarkoTopolnik 添加了调用它的字符串。
  • 上面是被传递的确切字符串。

标签: java regex quoting


【解决方案1】:

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

当您像这样粘贴字符串 (?&lt;=\\().+?(?=\\){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} 归属于(?=\\) 部分而不是(?&lt;= 部分。

【讨论】:

  • +1 漂亮的答案 :) 我对这个问题有一个盲点,并在我的示例中自动将反斜杠加倍,而没有考虑到这可能会给 OP 带来麻烦。
  • 我自己想通了就收到了您的答案。谢谢。 :)
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 2014-09-12
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2013-08-03
    相关资源
    最近更新 更多