【问题标题】:Java Regular Expressions equivalent to PCRE/etc. shorthand `\K`?Java 正则表达式等价于 PCRE/等。简写“\K”?
【发布时间】:2022-01-05 01:00:42
【问题描述】:

Perl RegEx 和 PCRE (Perl-Compatible RegEx) 等都有简写 \K 来丢弃它左边的所有匹配项,但捕获组除外,但 Java 不支持它,那么 Java 的等价物是什么?

【问题讨论】:

  • 左边部分是否包含变长模式?
  • Java 中没有等价物。但是,您可以使用捕获组获得所需的内容。有时可以使用lookbehind,但大多数时候效率较低。
  • @revo 通常是这样。
  • @rautamiekka:请检查下面的答案。
  • @WiktorStribiżew Ya,已经意识到了。

标签: java regex equivalent


【解决方案1】:

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

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

rexegg.com \K reference:

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

有一个替代方案,但只能用于更小、更简单的 模式。一个constrained width lookbehind

只要匹配字符串的长度在预先确定的范围内,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());
    }
    

请参阅Java demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 2010-10-08
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2012-06-19
    相关资源
    最近更新 更多