2

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

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

4

2 回答 2

3

希望这有效

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

您应该设置singleline上述正则表达式的工作模式

这里工作

于 2012-10-10T13:34:52.613 回答
3

一般来说,编写一个匹配你想要的东西的正则表达式比一个匹配所有你不想要的东西的正则表达式要容易得多。

在这种情况下,您想“排除除plipand之外的所有单词plop”,但为什么不只包含plipandplop呢?

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));

此外,假设您的实际单词列表比plipand更复杂plop,您可以执行类似var pattern = string.Join("|", words);构建模式的操作。

于 2012-10-10T13:36:48.853 回答