簡體   English   中英

正則表達式可精確匹配一行中的4個整數或2個雙精度值

[英]Regular Expression for exact match of either 4 integers or 2 doubles in a line

我正在嘗試識別文件中具有4個整數或2個雙精度值的行。 我的正則表達式如下:

 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行和第5行。沒關系。 但是,它也與第3行(0 1 129)相匹配。 那是我的問題。 請建議:

  1. 為什么我的正則表達式匹配第3行。
  2. 更正正則表達式,該正則表達式恰好匹配4個no。 整數或2個數字 一行中的雙精度值。

我認為這是您要尋找的:

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

在這里測試。


說明

^(
  ((\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)

您最初嘗試中的錯誤是數字之間缺少必需的空格。

您的正則表達式說:

(\d+\s*){4}

這意味着它將與以下四次匹配,並盡可能多地匹配:

  • 一系列數字,然后是
  • 零到無限制的空間。

這就是它與第3行匹配的方式:

0 1 12 | 9

之后的一切| 在組4中。發生的情況是,引擎看到0 1 129並考慮如何匹配其中的\\d+\\s*中的4個。 由於空格是可選的,因此可以,我將數字直接分割到9之前。這樣\\d+\\s*就有4個。

為了解決這個問題,您需要編寫一個模式,說匹配\\d+\\s+ 3次和\\d 1次。 您還需要在“ 2個十進制數字”條件下執行此操作。

^(?<Values>(((\d+\s+){3}\d+)|(\d+\.\d+\s+)\d+\.\d+))\s*$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM