Java正则表达式等同于PCRE/etc.简写`\ K`?

rau*_*kka 8 java regex equivalent

\K除了捕获组之外,Perl RegEx和PCRE(Perl-Compatible RegEx)除了捕获组之外还有速记丢弃它左边的所有匹配,但Java不支持它,那么Java与它的等价物是什么?

Wik*_*żew 6

没有直接的等价物.但是,您始终可以使用捕获组重新编写此类模式.

如果您仔细查看\K运算符及其局限性,您将看到可以用捕获组替换此模式.

请参阅rexegg.com \K参考:

在模式的中间,\K说"重置报告的匹配的开始到这一点".在\K没有报告之前匹配的任何东西,有点像在后面看.

\K和lookbehind 之间的关键区别在于,在PCRE中,lookbehind不允许您使用量词:您查找的长度必须是固定的.另一方面,\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));
}
Run Code Online (Sandbox Code Playgroud)

有一种替代方案,但只能用于更小,更简单的模式.甲约束宽度回顾后:

只要匹配字符串的长度落在预定范围内,Java就会接受lookbehind中的量词.例如,(?<=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());
    }
Run Code Online (Sandbox Code Playgroud)

请参阅Java演示.