2012-10-17 32 views
0

背景優化多個表達式的一個

我遇到的情況,我必須多次找到某些詞文字,一遍又一遍。 我已經目前使用了一系列的正則表達式在這樣的格式...

"((^)|(\W))(?<c>Word1)((\W)|($))" 

"((^)|(\W))(?<c>NextWord)((\W)|($))" 

"((^)|(\W))(?<c>AnotherWord)((\W)|($))" 

...

正則表達式的這對象列表是他們通過循環使用的數據塊和匹配是(一個循環爲一個正則表達式。匹配(數據)調用)

我已經盡我所能來優化它們,比如先編譯它們。

然而,列表的時間越來越長,我決定開始製作更大的編譯正則表達式來優化過程。如...

"((^)|(\W))(?<c>((Word1)|(NextWord)|(AnotherWord)))((\W)|($))" 

這提供了一個巨大的速度imporvement,但有一個副作用,我無法弄清楚如何糾正。

當單詞在數據中並排(如空格分隔,例如「Word1 NextWord AnotherWord」)時,由於「Word1」的正則表達式還包含尾部空格,因此在捕獲中會丟失第二個單詞。 「NextWord」可能發生的匹配不再具有領先的空間,因爲它是前一場比賽的一部分。

問題

誰能改變這個正則表達式(.NET格式)

Pattern = "((^)|(\W))(?<c>((Word1)|(NextWord)|(AnotherWord)))((\W)|($))" 

工作來捕獲在這個列表中的所有單詞下面一個調用」 .matches(數據)「 其中

data = "Word1 NextWord AnotherWord" 

? (在不犧牲效率增益)

成績

只是想我要提到這一點。在應用建議的答案/校正後,我將看到後面的內容,我現在知道如何使用:),我剛剛修改的代碼速度提高了347倍(舊測試速度的0.00347%)。當你進入多個表達式時,這是最初要記住的東西。很高興。

+1

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

您可能希望使用邊界檢查或前瞻/後視,以便匹配不消耗空白但檢查它。

像這樣:

Pattern = @"\b(Word1|NextWord|AnotherWord)\b" 

或者與回顧後和預讀:

Pattern = @"(?<=\W|^)(Word1|NextWord|AnotherWord)(?=\W|$)" 
+0

你有一個「向後看」的簡單例子嗎?我有更多的匹配類型,邊界詞不起作用,我不熟悉它。 邊界這個詞可以用於這個例子。謝謝。 – DarrenMB

+0

@Lucero:對。這是爲了這個問題,而不是一個答案。 –

+0

@Darren編輯了一個lookbehind/lookahead的例子。 – Lucero

1

使用\b符號。這匹配在單詞/非單詞邊界上。

\b(?((Word1)|(NextWord)|(AnotherWord)))\b