解析

2017-08-22 66 views
2

正則表達式的可選組已經與此幾個小時擺弄...解析

我試圖分析這種形式的錯誤信息:

[error] C:\Me\MyPath\myFile.scala:18:22: not found: value getaa 

我能做到這一點罰款與以下正則表達式:

\[(error|warn)\]\s+(.+):(\d+):(?:\d+:)\s+(.+)$ 

哪個正確生成組:

error 
C:\Me\MyPath\myFile.scala 
18 
not found: value getaa 

但爲了使這個健壯,我需要使22:部分可選(因爲某些版本的scala編譯器不輸出列號)。換句話說,它需要產生相同的組如上該字符串太:

[error] C:\Me\MyPath\myFile.scala:18: not found: value getaa 

我試圖把一個問號可選的組後,但不工作 - 它攪亂了原有的組。我認爲有一些關於懶惰和貪婪的東西,我不理解。 Here is a working sample on regex101。謝謝你的幫助。

回答

2

您需要添加兩個問號:

\[(error|warn)\]\s+(.+?):(\d+):(?:\d+:)?\s+(.+)$ 
        ^   ^

看到一個regex demo

.+?結果會比換行字符儘可能少其他任何字符1+,並因此將匹配直到第一次出現子模式。第二個?將使(?:\d+:)組可選。

完整圖案詳細

  • \[ - 一個[
  • (error|warn) - 或者只是] - - 單一]
  • 兩個子串(errorwarn
  • \]之一\s+ - 1+空格
  • (.+?) - 除換行符之外的任何1+字符,儘可能少,直到第一個...
  • : - 冒號
  • (\d+) - 組2:一個或多個數字
  • : - 冒號
  • (?:\d+:)? - 非捕獲組之後他們匹配1+數字和冒號1或0次
  • \s+ - 1+空格
  • (.+) - 組3:行
  • $的其餘部分 - 串的端部(N因爲.+是一個貪婪的子模式)
+1

完美的作品。謝謝,並且非常清楚的解釋。 – thund

3

你猜對了。這是由於.+的貪婪造成的。它吞噬整個輸入文本,然後嘗試通過一次放棄一個字符來回溯,直到模式結束匹配。

作爲一個經驗法則,你應該永遠除非.+明確想去的輸入端。

這裏的固定模式:

^\[(error|warn)\]\s+(.+?):(\d+):(?:(\d+):)?\s+(.+)$ 

Demo

+0

完美的作品。謝謝。你的經驗法則不使用。+現在有很多意義。下面的答案有更多的細節,但希望我可以接受兩個。 – thund