相当于PCRE/等的Java正则表达式。简写`\K`?

问题描述 投票:0回答:2

Perl RegEx 和 PCRE(Perl 兼容的 RegEx)等都有简写

\K
来丢弃其左侧的所有匹配项(捕获组除外),但 Java 不支持它,那么 Java 的等价物是什么?

java regex equivalent
2个回答
8
投票

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

如果您仔细查看

\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));
}

还有一种替代方案,但只能用于更小、更简单的 模式。 约束宽度后视

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());
    }
    

请参阅 Java 演示


0
投票

或者,当您寻找高级功能时,可以通过 https://pcre4j.org 使用 Java 中的 PCRE2 引擎。

© www.soinside.com 2019 - 2024. All rights reserved.