正则表达式除了一些单词之外的所有排除

时间:2012-10-10 13:22:36

标签: c# regex

我虽然过滤了一个字符串,如: "Hello <strong>plip</strong> plop" 获得 "plip plop",即排除除“plip”和“plop”之外的所有单词,使用此C#行很容易: new Regex("[^(plip)(plop)]").Replace(inputString,"")。 不幸的是,排除括号[^]似乎不接受排除词,因为它保留了'plip'和'plop'中包含的每个字母(结果为"llooplipoplop")。

有没有办法在单个正则表达式/行中实现这一点,或者是否需要循环其他所有plip和plop匹配,然后将它们连接起来?

2 个答案:

答案 0 :(得分:3)

希望这有效

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

您应该将上述正则表达式的singleline模式设置为

工作here

答案 1 :(得分: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);之类的操作来构建模式。