2011-12-21 40 views
1

我一直在編寫一個文件解析器,並在解析器中使用正則表達式解析每一行,如果它匹配,那麼我解析出數據。使用正則表達式匹配n次

現在我應該承認,我的正則表達式的知識是基本充其量......

所以我有一個線,看起來像這樣:

(-3456 -3104 344 -24 -10 1 0 0) (-3456 -2976 344 -23 -10 1 0 0) (-3456 -2976 312 -23 -9 1 0 0) 

8浮點值(以上括號,重複n次(以上3,但可能我更多或更少)

我嘗試這樣做:

\((.*?) \) 

哪個解析出括號(我然後分析出使用另一個正則表達式)的內容,但也符合線路是這樣的:我沒有想它

/* iap 0 */ 4 5 1 (176 -1272 120) (176 -1272 264) (176 -1416 264) (176 -1416 120) 

。我想這是因爲我不指定開始^

但如果我這樣做,我只似乎得到第一組括號...

^\((.*?) \) 

我一直在看這幾個小時,進入圈子,但努力找到我的事後指針/幫助嗎?

回答

1

這將這樣的伎倆來區分你的例子:

^(\([0-9. -]+\) *)+$ 

它尋找一個或多個組的括號(括號內),只有數字,空格,連字符(減號)和小數點內。它還允許組之間有空白,並要求它們佔據整條線。如果您需要它只匹配八組數字,那看起來會有點不同。

+0

這似乎只捕捉到中間套括號對我來說?我最終得到了2組 - 一切爲1,中間爲1。 – 2011-12-21 15:12:15

+0

我設法深入挖掘,如果我正確地瀏覽比賽/小組/捕捉,這種方法可行。我已經將艾哈邁德的答案標記爲有幫助,因爲那裏有清晰簡明的信息量! – 2011-12-21 16:42:44

2

如果你想的模式限制爲匹配八位數字請嘗試以下方式:

string pattern = @"\(\s*(-?\d+(?:\.\d+)?\b\s*){8}\)"; 

foreach (Match m in Regex.Matches(input, pattern)) 
{ 
    Console.WriteLine(m.Value); 
} 

,您可以訪問捕獲的值的組中,而不是使用正則表達式第二搶號。這將是這樣的:

foreach (Match m in Regex.Matches(input, pattern)) 
{ 
    Console.WriteLine("Match: " + m.Value); 
    foreach (Group g in m.Groups) 
    { 
     foreach (Capture c in g.Captures) 
     { 
      Console.WriteLine(c.Value); 
     } 
    } 
    Console.WriteLine(); 
} 

記住,捕獲組中的第一項代表了整場比賽,所以如果你不需要它,你可以跳過它(使用for循環和索引起點在1)。

擊穿模式:

  • \(\s*:字面(和空白(任何數量的重複)
  • -?\d+(?:\.\d+)?:可選的負符號,一個或多個號碼,和一個可選的小數點後面數字(後一部分處於非捕獲組內,因爲它在(?: ...)
  • \b\s*:字邊界以確保每個數字之後的匹配結束,後跟零個或多個空白字符
  • 模式的最後兩個部分在捕獲組,因爲它們是括號
  • {8}括起來:重複正好是8倍
  • \):字面)
+0

不幸的是,這和我的問題一樣 - 第二個例子匹配,如果有一組括號中有8個數字,而它不應該(它有模式的一部分,但並不完全遵循模式)。 – 2011-12-21 09:53:34