2012-12-07 42 views
0

我有4個正則表達式,我得到了起來,他們工作很好,但在一些應用程序,他們釘住了CPU。我知道他們是最好看的正則表達式,但我不確定更好的方法。我能做些什麼來優化這些正則表達式嗎?正則表達式是盯着CPU

public static Regex schemaOrg = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://schema.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled); 
public static Regex dataVocabulary = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://data-vocabulary.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled); 

基本上在尋找:

itemtype="http://schema.org/" 
itemtype="http://data-vocabulary.org/" 

但隨着空格的量,因爲這仍然將是HTML有效。

例如:

itemtype ="http://schema.org/" 
itemtype= "http://schema.org/" 
itemtype=" http://schema.org/ " 

都將是有效的。

更新:仍然包裝了CPU壞。

\s+itemtype\s*=\s*(?:'|"")\s*http://schema\.org/ 
+0

你是否錯過了結尾的'('|「」)? – dasblinkenlight

+0

@dasblinkenlight:如果有的話,它應該是一個關閉'\ 1'。 –

+0

@TimPietzcker當然它*應該*(並且在答案中*會*),但是在詢問OP是否忘記了尾部引號'('|「」)'的評論比反向引用更容易理解。 – dasblinkenlight

回答

2

我只能想到到目前爲止有幾件事。

  • 拖尾\s*(在schema.org/\s*vocabulary.org/\s*)不是必需的,將其刪除。我假設這是因爲你沒有檢查尾隨引號。
  • . (dot)在正則表達式中有特殊含義,像\.這樣在schema.orgdata-vocabulary.org之間轉義。
  • 第一個\s*沒有意義,因爲它也會與someitemtype匹配您的模式。請將其替換爲\s+或嘗試使用字邊界\b作爲模式的開始。
  • 如果您對此偏執,您還可以通過將其替換爲(?:'|"")來阻止Regex捕獲組('|"")

編輯:你也可以嘗試懶惰匹配,看看它是否有幫助。我可以想象一下,你的正則表達式會扼殺CPU。嘗試下面的示例正則表達式:

\s+?itemtype\s*?=\s*?(?:'|"")\s*?http://schema\.org/ 

如果這沒有幫助,請在此問題的上下文中發佈代碼和示例字符串。

+0

+1:對於實際看到'.',P – leppie

+0

你說對了。 '.'(點),就像是令人費解的正則表達式的螞蟻,很容易錯過當URL正則表達式的一部分。 –

+0

這仍然掛在CPU非常。我錯過了任何改變嗎?在OP。 – Adam

0

一個可能的改進是:

「到 」「 做regex.match

那麼你的正則表達式前不需要全部替換」 所有這些\ S

相關問題