gpt4 book ai didi

java - Java中存在明显的Look-behind group最大长度

转载 作者:行者123 更新时间:2023-12-04 07:00:20 26 4
gpt4 key购买 nike

在此 Java 代码中:

public class Main {
public static void main(String[] args) {
"".matches("(?<!((.{0,1}){0,1}))");
}
}

编译器(我使用的是 JVM 1.6.0_17-b04)大喊“异常......后视组没有明显的最大长度”。我看到了 here那:

Java takes things a step further by allowing finite repetition. You still cannot use the star or plus, but you can use the question mark and the curly braces with the max parameter specified. Java recognizes the fact that finite repetition can be rewritten as an alternation of strings with different, but fixed lengths.



但是......在上面的代码中有非常明显的有限最大长度 - 1(简单的产品)。

当然,真正的问题在于更复杂的模式,例如:

(?
(好词,后面没有坏词,在 7 字范围内)。

我该如何解决?

最佳答案

如果您从负向后视中删除捕获组,那么它似乎可以编译。我什至不确定意图是什么,或者捕获组应该在负面回顾中做什么。这是故意的吗?

编辑以澄清:

你写了正则表达式:

"(?<!((.{0,1}){0,1}))"
"(?<!" part 表示负面的后视,因为您想找到之前不会发生的匹配项。然而,它充满了捕获组......即:所有那些裸体 () .这没有任何意义,因为它们不可能捕捉到任何东西,因为它是背后的负面看法。 (如果您不精通正则表达式,则捕获组用于在匹配发生后提取匹配的特定子范围。)

把所有这些括号去掉,你就不会再收到错误了......更不用说它们是不必要的:
"(?<!.{0,1}{0,1})"

例如,上述部分将正常工作。如果您确实需要在后面否定括号,那么您应该使用像“(?:mypattern)”这样的非捕获组。在这个简单的示例中,无论哪种方式,它们都没有真正为您做任何事情,双 {0,1} 有点多余。

编辑2:

所以我试图让你更复杂的例子工作,甚至切换到非捕获组也不能摆脱 Java 正则表达式的困惑。解决它的唯一方法似乎是按照评论中的建议去掉 {0,6}。

例如,这将编译:
"(?<!bad(?:\\s{1,99}(?:\\S{1,99}\\s{1,99})?(?:\\S{1,99}\\s{1,99})?(?:\\S{1,99}\\s{1,99})?(?:\\S{1,99}\\s{1,99})?(?:\\S{1,99}\\s{1,99})?(?:\\S{1,99}\\s{1,99})?))good"

...并做同样的事情,但它更丑陋。

在这种情况下,正则表达式可能不是完整的答案,而只是需要多次通过的更大解决方案的一部分。

关于java - Java中存在明显的Look-behind group最大长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1971652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com