正则表达式用于一行中4个整数或2个双精度的精确匹配

时间:2017-08-18 05:57:51

标签: c# regex

我正在尝试识别文件中具有4个整数或2个double值的行。我的正则表达式如下:

 var match = new Regex(@"^(?<Values>(((\d+\s*){4})|(\d+\.\d+\s*){2}))$");

要解析的文件中的行样本:

element 1 2
8 24 2 1 1
0 1 129
2 2 0 0 
30.200001 1000.0000
208 0 0 0 0 0 0 0 
.....
.....

在这里,我的正则表达式正确匹配上面的第4行&amp;那没关系。但是,它也匹配第3行(0 1 129)。这对我来说是个问题。 请建议:

  1. 为什么我的正则表达式匹配第3行。
  2. 正确匹配4 no的正则表达式。整数或2没有。一行中的双值。

2 个答案:

答案 0 :(得分:2)

我认为这是你正在寻找的东西:

^(((\d+\s+){3}\d+)|(\d+\.\d*\s+\d+\.\d*))\s*$

经过测试here

<强>说明

^(
  ((\d+\s+){3}\d+) # 4 numbers separated by at least one space
  |
  (\d+\.\d*\s+\d+\.\d*) # 2 floats separated by at least one space
)\s*$ # optional spaces at end of line (e.g., line 4)

您最初尝试的错误是数字之间缺少必要的空格。

答案 1 :(得分:2)

你的正则表达式说:

(\d+\s*){4}

这意味着它将尽可能多次匹配以下四次:

  • 一系列数字,然后是
  • 零到无限空格。

这就是第3行的匹配方式:

0 1 12 | 9

|之后的所有内容都在第4组中。发生的情况是引擎看到0 1 129并且考虑如何匹配4 \d+\s*中的\d+\s*。由于空格是可选的,所以说好了,我只是将数字拆分为9之前。这样就有4个\d+\s+

要解决此问题,您需要编写一个匹配\d 3次和^(?<Values>(((\d+\s+){3}\d+)|(\d+\.\d+\s+)\d+\.\d+))\s*$ 1次的模式。您还需要对&#34; 2十进制数字进行此操作&#34;条件。

{{1}}