Java正则表达式中对应PCRE/等效的`\K`简写的方法是什么?

11

Perl RegEx 和 PCRE(Perl-Compatible RegEx)等都有一个名为 \K 的简写,可以舍弃其左侧的所有匹配项,但保留捕获组,而 Java 不支持该符号,那么 Java 中的替代方法是什么?


左侧是否包含可变长度的模式? - revo
Java中没有相应的功能。但是您可以使用捕获组来获取所需内容。有时可以使用后顾,但大多数情况下效率较低。 - Casimir et Hippolyte
通常情况下是这样的。 - rautamiekka
@rautamiekka:请检查下面的答案。 - Wiktor Stribiżew
@WiktorStribiżew 是的,我知道。 - rautamiekka
1个回答

8

没有直接的等效物。但是,您始终可以使用捕获组重新编写这些模式。

如果您仔细查看\K运算符及其限制,您会发现可以使用捕获组替换此模式。

请参见rexegg.com \K参考:

在模式的中间,\K表示“将报告的匹配的开头重置为此点”。在\K之前匹配的任何内容都不会被报告,有点像向后查找。

\K和后向引用之间的关键区别在于,在PCRE中,后向引用不允许您使用量词:您要查找的长度必须固定。另一方面,\K可以放在模式的任何位置,因此您可以在\K之前使用任何量词。

然而,所有这些意味着\K之前的模式仍然是消耗模式,即正则表达式引擎在匹配模式时将匹配的文本添加到匹配值中并推进其索引,而\K仅从匹配中删除匹配的文本,保留索引所在的位置。这意味着\K与捕获组一样好。

因此,value\s*=\s*\K\d+ PCRE/Onigmo模式将转换为以下Java代码:

String s = "Min value = 5000 km";
Matcher m = Pattern.compile("value\\s*=\\s*(\\d+)").matcher(s);
if(m.find()) {
    System.out.println(m.group(1));
}

有一种替代方案,但只适用于较小、较简单的模式。这是一种受限宽度的向后查找

Java允许在向后查找中使用量词,只要匹配字符串的长度在预定范围内即可。例如,(?<=cats?) 是有效的,因为它只能匹配三个或四个字符的字符串。同样,(?<=A{1,10}) 也是有效的。

所以,这种方法也可以奏效:

    m = Pattern.compile("(?<=value\\s{0,10}=\\s{0,10})\\d+").matcher(s);
    if(m.find()) {
        System.out.println(m.group());
    }
    

请查看Java演示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接