C # регулярное выражение найти и удалить текст после соответствия строки - PullRequest
2 голосов
/ 24 июня 2019

Я хочу найти и удалить все после соответствующей строки в тексте и заменить его текстом, я новичок в регулярных выражениях

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

Как получить такое же регулярное выражение, чтобы найти только «От:» и заменить все после него (но в той же строке) на От: «отредактировано».

Ответы [ 3 ]

2 голосов
/ 24 июня 2019

Вы можете использовать

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

Или, в сочетании с To:,

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

Здесь,

  • \b - граница слова
  • ((?:From|To):) - Группа захвата 1: либо From, либо To, затем :
  • .* - любые 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]*".

0 голосов
/ 24 июня 2019

Как насчет

Regex.Replace("From: Tom", @"From\:.*", "From: redacted")
0 голосов
/ 24 июня 2019

Я почти уверен, что нам здесь могут не потребоваться регулярные выражения, но если я ошибусь, возможно, мы начнем с этих выражений

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

, и мы заменим их на

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

См. Демо здесь для объяснения.

Тест

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...