代码之家  ›  专栏  ›  技术社区  ›  AlexFF1

C#regex在匹配的字符串后查找并删除文本

  •  0
  • AlexFF1  · 技术社区  · 5 年前

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

    如何使用相同的正则表达式查找“From:”,并将其之后的所有内容(但在同一行)替换为From:“redacted”。

    0 回复  |  直到 5 年前
        1
  •  2
  •   Wiktor Stribiżew    5 年前

    你可以用

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

    To: ,

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

    • \b -字界
    • ((?:From|To):) -捕获组1:任意一个 From To :
    • .* -尽可能多地使用除linebreak字符以外的任何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 backreference是在替换时将此值放回结果中。

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

    另外,如果 只有在 ,你需要在它前面加上 ^ RegexOptions.Multiline 修饰符,或 (?m) 内联修饰符, "(?m)^(From:)[^\r\n]*" .

        2
  •  0
  •   Emma    5 年前

    ([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);
        }
    }
    
        3
  •  0
  •   Chris    5 年前

    怎么样

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