我正在尝试识别文件中具有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)。这对我来说是个问题。 请建议:
答案 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}}