代码之家  ›  专栏  ›  技术社区  ›  xiaodai

如何使用正则表达式(regex)捕获下一个括号?

  •  0
  • xiaodai  · 技术社区  · 5 年前

    我有一堆这样的文字“KM[6.5];B[fp];W[gh]”

    我想捕获“KM”后面括号内的内容,所以在上面的示例中是6.5。

    "KM\[(?<komi>.*)\] 6.5];B[fp];W[gh] .

    1 回复  |  直到 5 年前
        1
  •  0
  •   Peter Thoeny    5 年前

    .* 他很贪婪。尝试此非贪婪匹配:

    KM\[(?<komi>.*?)\]
    

    或者更快,使用以下命令:

    KM\[(?<komi>[^\]]*)
    

    [^\]]* 比非贪婪扫描更快:

    考虑以下简单示例:当正则表达式 <.*?> <[^>]*> 应用于主题字符串 "<0123456789>" ,它们在功能上是等价的。唯一的区别是regex引擎如何生成匹配。然而,后一个regex(使用贪婪的量词)更有效,因为它描述了用户真正的意思:匹配字符 "<" ">" ,最后,匹配角色 “>” . 这样定义的话,在匹配成功的情况下不需要回溯,在匹配不成功的情况下只需要一个回溯步骤。正则表达式模式的手工优化主要围绕着减少回溯和在任何给定字符位置匹配或失败可能需要的步骤的思想,这里我们将这两种情况都减少到绝对最小。(来源: https://blog.stevenlevithan.com/archives/greedy-lazy-performance )