2012-10-10 56 views
2

我雖然是過濾像一個字符串: "Hello <strong>plip</strong> plop" 獲得 "plip plop",即未計入除了「PLIP」和「撲通」所有的話會很容易使用本C#線: new Regex("[^(plip)(plop)]").Replace(inputString,"") 。 不幸,排除括號[^]似乎不接受排除詞,因爲它使每個字母包含在'plip'和'plop'中(結果爲"llooplipoplop")。正則表達式是排除所有除了一些話

有沒有辦法在一個單一的正則表達式/行,或者是否有必要循環其他所有匹配的plip和plop,然後concat它們呢?

+1

'[^(plip)(plop)]'不會做你認爲它做的事情,它與[^()plio]相同(即匹配除那六個以外的任何字符)。這確實會跳過'plip'和'plop'中的所有字符,而且''hello'中的'l's和'o'以及'strong'中的'o'也會跳過。 – verdesmarald

回答

3

一般來說,這是很容易編寫符合什麼是正則表達式你確實需要比你不想要的所有東西都要好的東西。

在你想「排除一切的話,除了plipplop」這種情況下,但爲什麼不乾脆只包括plipplop呢?

var input = "Hello <strong>plip</strong> plop"; 
var matches = Regex.Matches(input, "plip|plop"); 
var result = string.Join("", matches.Cast<Match>().Select(x => x.Value)); 

Console.Out.WriteLine(result); // prints "plipplop" 

當然,既然你問了一個俏皮話,你可以沒有臨時變量的一切(和好運到下一個人閱讀的代碼!):

var result = string.Join("", Regex.Matches("Hello <strong>plip</strong> plop", "plip|plop").Cast<Match>().Select(x => x.Value)); 

另外,假設你的實際單詞列表比plipplop更復雜,你可以做一些類似於var pattern = string.Join("|", words);的構造模式。

+0

謝謝,我終於採用了這種做法,因爲這個正則表達式更清晰,更容易維護。 –

3

希望這個作品

(?<=(\bplip\b|\bplop\b|^)).*?(?=(\bplip\b|\bplop\b|$)) 

應設置singleline方式爲上述正則表達式的工作

工作here

+0

感謝這個純粹的正則表達式提議!太糟糕了,「(\ bplip \ b | \ bplop \ b | $)」組必須重複。 –