2016-04-26 138 views
3

我想匹配的結構是這樣的一行:正則表達式需要很長的時間才能完成

  • 線開始
  • 多「 - 」
  • 也許一個空白(也許更多)
  • 至少一個字符
  • 也許更多的字符和空格
  • 也許一個空白(也許更多)
  • 多「 - 」
  • 行末

所以我寫的正則表達式是這樣的:

new Regex(@"^\-{2,}\s*(\w+(\w+|\s)*)\s*\-{2,}$"); 

當我嘗試匹配下面的行,這需要年齡完成(沒」迫不及待它完成):

-------- Variable used for recipe visualization only - Not loaded into PLC -------- 

我覺得有一個在它和正則表達式匹配的一個非常大的數量已經很難列舉所有的比賽,但我不河畔即

環境信息:Windows 7中,框架3.5

謝謝

編輯:感謝你的幫助,我想出了一個可行的正則表達式:

^-{2,}\s*(?!\-)(\w(?:\w|\s|\-)+)(?<!\-)\s*-{2,}$ 

於是解釋:

  • 行首
  • 至少有兩個 ' - '
  • 也許一個空白(也許更多)
  • 沒有更多 ' - '
  • 至少一個字符
  • 也許更多的字符,空格或 ' - '
  • 沒有更多 ' - '
  • 也許一個空白(也許更多)
  • 至少有兩個 ' - '
  • 結束行
  • 的10

如果你看到的東西錯了,請告訴我

+1

由於「只有 - 不是」的內部破折號,這不會匹配。 – juharr

+1

你的問題是你不允許中間的' - '被捕獲 – Jonesopolis

+1

我剛剛在https://myregextester.com/index.php上試過這個,它在0.018301秒內運行。但在C#中運行確實需要很長時間,但刪除內部破折號確實會加快速度。 – juharr

回答

4

展開嵌套組的

^-{2,}\s*(\w+(?:\s+\w+)*)\s*-{2,}$ 
      ^^^^^^^^^^^ 

否則,你的模式就容易catastrophic backtracking

參見regex demo

另外,使用的原子團禁用任何回溯到交替組:

^-{2,}\s*((?>\w+(?:\w+|\s)*))\s*-{2,}$ 
      ^^^   ^

參見this regex demo

通常,避免與嵌套量詞交替(如在(\w+|\s)* )內部較長的模式。

+0

編輯我的答案,包括適用於這種情況下的正則表達式。你能否看看,並告訴我是否有什麼可能是錯的?謝謝 – nkoniishvt

+2

正則表達式不是最優的。 '(!! - )'是完全多餘的,因爲下一個子模式是'\ w',因此前瞻檢查結果總是* true *。我會重寫爲'^ - {2,} \ s *(\ w +(?:[\ s-] + \ w +)*)\ s * - {2,} $' )''是沒有必要的,那麼因爲在最後一個可選的空格和連字符之前唯一可能的字符可以是一個單詞字符。請注意,'-'不必在字符類之外轉義。 –

+0

謝謝所有這些信息 – nkoniishvt

相關問題