Perl RegEx 和 PCRE(Perl-Compatible RegEx)等都有一个名为 \K
的简写,可以舍弃其左侧的所有匹配项,但保留捕获组,而 Java 不支持该符号,那么 Java 中的替代方法是什么?
Perl RegEx 和 PCRE(Perl-Compatible RegEx)等都有一个名为 \K
的简写,可以舍弃其左侧的所有匹配项,但保留捕获组,而 Java 不支持该符号,那么 Java 中的替代方法是什么?
没有直接的等效物。但是,您始终可以使用捕获组重新编写这些模式。
如果您仔细查看\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());
}