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

时间:2017-07-23 13:33:31

标签: java regex equivalent

Perl RegEx和PCRE(Perl-Compatible RegEx)除了捕获组之外,还有简写\K来丢弃它左边的所有匹配,但Java不支持它,所以什么是Java相当于它?

1 个答案:

答案 0 :(得分:6)

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

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

请参阅rexegg.com \K reference

  

在模式中间,\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));
}

有一种替代方案,但只能使用更小,更简单的方法 图案。一个constrained width lookbehind

  

只要匹配字符串的长度落在预定范围内,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 demo