反转或反转正则表达式匹配

时间:2016-06-16 11:26:25

标签: c# regex

我已经看过几篇关于否定匹配的帖子,即使用“not”运算符,但我正在寻找一些略有不同的东西。我想匹配和替换,但使用“反向选择”。

我将使用一个比喻来尝试解释:

想一下文字处理文档。当您使用“搜索和替换”时,您可以在某些软件中获取文档中所有匹配项的突出显示。使用正则表达式,这当然是匹配,我可以用我喜欢的任何东西替换它们。但是如果我想用一些短语替换其他所有内容该怎么办?

想象一下,我有一个允许的单词列表,为了简单起见,现在只包含一个单词“and”(我非常挑剔)而且我想要替换所有不允许单词的单词字符串“(审查)”。

如果输入是“我很友好,我喜欢穿忍者服装”,那么输出应该是“(审查)和(审查)和(审查)”。

问题是一般性的,但我主要使用C#,如果我实现这一点,很可能会在C#中使用Regex。

3 个答案:

答案 0 :(得分:1)

您可以使用((.\*?)(and))|((.\*)$)选项使用此/g这样的正则表达式捕获“和”周围的所有文字。这将匹配最后一个和之后的所有文本和最后一段文本。然后,您必须处理匹配组以替换正确的部件并将其留在原位: https://regex101.com/r/dP4yG6/1

答案 1 :(得分:1)

您可以使用

(.+?)(\s?and\s?|$)

并替换为

(censored)$2

Check it out here

答案 2 :(得分:1)

这是一种基于Regex.Split的简单方法,其中的模式包含整个单词and的捕获组:

var str = "I am nice and friendly and I like to wear ninja outfits";
var rx = new Regex(@"(\band\b)");
var res = rx.Split(str).Select(x => x == "and" ? x : // Keep "and"
          !String.IsNullOrWhiteSpace(x) ?            // If x is not null or empty
               "<censured>" : "")              // Replace with <censured>, else emtpy string
          .ToList();
Console.WriteLine(string.Join("", res));

输出:<censured>and<censured>and<censured>

请参阅IDEONE demo