【问题标题】:C# regex find and remove text after a string matchedC# 正则表达式在字符串匹配后查找并删除文本
【发布时间】:2019-06-24 18:34:16
【问题描述】:

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

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

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

【问题讨论】:

  • 文中有:,为什么在正则表达式中使用;?
  • 你是怎么得到这些字符串的?它是可预测的吗?正则表达式对我来说似乎有点矫枉过正。
  • @BrootsWaymb 来的字符串可以不一样
  • 你不需要匹配From:,它已经是一个已知的字符串。我的两个建议都可以满足您的需求。见ideone.com/B2nsTW

标签: c# regex string text


【解决方案1】:

你可以使用

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

或者,结合To:,

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

这里,

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

见C# demo

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 修饰符或@ 编译正则表达式987654342@ 内联修饰符,"(?m)^(From:)[^\r\n]*"。

【讨论】:

  • 酷,作为其他选项,想知道是否可以在表达式中将 From: 和 To: 组合在一起,所以它找到 From: 和 To:...
  • 这是一个完美的例子,详细解释了一切,应该可以帮助其他有类似模式的人
【解决方案2】:

我很确定我们在这里可能不需要正则表达式,但如果我错了,也许我们会从这些表达式开始,

([a-z]+:)(.*?)([a-z]+:)(.*)
(From:)(.*?)(To:)(.*)
(From:)(.*?)([a-z]+:)(.*)

我们将替换为,

\1 "redacted"\n\3 "redacted"

Please see the demo here for explanation.

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"([a-z]+:)(.*?)([a-z]+:)(.*)";
        string substitution = @"\1 ""redacted""\n\3 ""redacted""";
        string input = @"From: Tom novy <AJames@onmicrosoft.com>
To: ""mithrandir@wttom.onmicrosoft.com""";
        RegexOptions options = RegexOptions.Singleline | RegexOptions.IgnoreCase;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}

【讨论】:

  • 以及如何只找到 From: ?
【解决方案3】:

怎么样

Regex.Replace("From: Tom", @"From\:.*", "From: redacted")

【讨论】:

  • 为什么要转义冒号?
  • 我在几乎所有非字母数字字符前面都放了一个转义符。在怀疑的时候给你信心:)
  • 您几乎不需要在正则表达式模式中转义冒号。您永远不需要在 .NET 正则表达式中对其进行转义。
  • 好的,我不知道所有特殊字符。我确信的是,每个人,包括我自己,读到这里,都不必问自己这个问题是否是一个特殊的字符。因为逃避它没有问题,我只是在我不确定的时候这样做。不疼。
  • 如果你在带有 HTML5 模式的 JS 中使用它,或者在编译带有 u 修饰符的 JS RegExp 对象时会很痛苦。你不会在 C# 中遇到问题,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多