首页 > 解决方案 > C# 正则表达式在字符串匹配后查找并删除文本

问题描述

我想在文本中匹配字符串之后查找并删除所有内容并将其替换为文本,我是正则表达式的新手

From: Tom novy <AJames@onmicrosoft.com>
To: "mithrandir@wttom.onmicrosoft.com"
From: David Cusack <AJames@onmicrosoft.com>

应该:

From: "redacted"
To: "mithrandir@wttom.onmicrosoft.com"
From: "redacted"

我有一个在字符后替换的正则表达式:

var regex = new Regex(@":(.*)");
var newText  = regex.Replace(testString1, "");

如何使用相同的正则表达式仅查找“发件人:”并将其后的所有内容(但在同一行)替换为发件人:“已编辑”。

标签: c#regexstringtext

解决方案


您可以使用

Regex.Replace(s, "(From:).*", "$1 \"redacted\"")

或者,结合To:,

Regex.Replace(s, @"\b((?:From|To):).*", "$1 \"redacted\"")

这里,

  • \b- 单词边界
  • ((?:From|To):)- 捕获组 1:要么 要么FromTo然后:
  • .*- 任何 0 个或多个字符,除了换行符,尽可能多。

查看C# 演示

var s = "From: Tom novy <AJames@onmicrosoft.com>\nTo: \"mithrandir@wttom.onmicrosoft.com\"\nFrom: David Cusack <AJames@onmicrosoft.com>";
Console.WriteLine(Regex.Replace(s, "(From:).*", "$1 \"redacted\""));

输出:

From: "redacted"
To: "mithrandir@wttom.onmicrosoft.com"
From: "redacted"

请注意,(From:).*匹配并捕获From:到第 1 组,并且$1反向引用在替换时将此值放回结果中。

注意.在 .NET 正则表达式中也匹配 CR 符号,因此如果您打算只替换到 CRLF 结尾,则需要.在正则表达式中替换为[^\r\n].

此外,如果From:只应在行首匹配,需要在其前面加上^锚并使用RegexOptions.Multiline修饰符或(?m)内联修饰符编译正则表达式"(?m)^(From:)[^\r\n]*"


推荐阅读