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

重复组捕获的匹配项比指定的多

  •  0
  • aybe  · 技术社区  · 4 年前

    我试图逐行匹配以下序列:

    • 起跑线
    • 这个 Kd 一串
    • 三四 float 格式可能混乱的数字
    • 行尾

    问题是,即使第4个样本中有5个数字,它也会被捕获。

    ^\s*Kd\s+.*(?:[-+]?0*\d*\.?\d*){3,4}$
    

    Kd   1.0  0.1   0.0
       Kd   .0  4.   01.
      Kd   .0  4.   01.  01.
     Kd   .0  4.   01. 01. 01.
        Kd   1.0  0.1   0.0  0.0
      Kd   1.0  0.1   0.0
    

    预期捕获:

    • 1.0, 0.1, 0.0
    • .0, 4., 01., 01.
    • 失败
    • 1.0, 0.1, 0.0

    问题:

    我在正则表达式中做错了什么,所以它也匹配了其中超过4个浮点数的行?

    1 回复  |  直到 4 年前
        1
  •  1
  •   Wiktor Stribiżew    4 年前

    主要问题是 .* 尽可能多次匹配除LF字符以外的任何零个或多个字符的部分。你还需要把 \s+ 进入重复组,以便允许数值之间有空格。

    ^\s*Kd(?:\s+([-+]?(?:\d*\.?\d+|\d+\.\d*))){3,4}$
    

    .NET regex demo :

    • ^ -字符串开头
    • \s*
    • Kd -固定字符串
    • (?:\s+([-+]?(?:\d*\.?\d+|\d+\.\d*))){3,4}
      • \+ -一个或多个空格
      • ([-+]?(?:\d*\.?\d+|\d+\.\d*)) -第一组:
        • [-+]? - +
        • (?:\d*\.?\d+|\d+\.\d*) -零位或多位数字,可选 . 和一个或多个数字,或一个或多个数字, .
    • $