Perl RegEx 和 PCRE(Perl 兼容的 RegEx)等都有简写
\K
来丢弃其左侧的所有匹配项(捕获组除外),但 Java 不支持它,那么 Java 的等价物是什么?
没有直接的等价物。但是,您始终可以使用捕获组重新编写此类模式。
如果您仔细查看
\K
运算符及其限制,您会发现可以用 捕获组 替换此模式。
参见 rexegg.com
\K
参考:
在模式中间,
表示“将报告的匹配的开头重置到这一点”。在\K
之前匹配的任何内容都不会被报告,有点像回顾。\K
和lookbehind之间的主要区别在于,在PCRE中,lookbehind不允许您使用量词:您查找的长度必须是固定的。另一方面,\K
可以放在模式中的任何位置,因此您可以在\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 演示。
或者,当您寻找高级功能时,可以通过 https://pcre4j.org 使用 Java 中的 PCRE2 引擎。