如何在c# Regex中使用lookbehind来删除换行符?

本文关键字:lookbehind 删除 换行符 Regex | 更新日期: 2023-09-27 17:53:05

我有一个具有重复结构的文本文件作为标题和详细记录,如

StopService::
697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to
A@gmail.com::0::::

我想删除标题和详细记录之间的换行符,以便将它们作为单个记录处理,因为详细记录也可以包含换行符,我只需要删除直接跟随::符号的换行符。

我不是使用正则表达式的专业人士,所以我搜索并尝试使用这种方法,但它不起作用:

 string text = File.ReadAllText(path);
 Regex.Replace(text, @"(?<=(:))(?!'1):'n", String.Empty);
 File.WriteAllText(path, text);

我也试过这个:

Regex.Replace(text, @"(?<=::)'n", String.Empty);

有没有人知道在这种情况下我如何使用正则表达式向后看?我的输出应该像这样:

StopService::697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to
    A@gmail.com::0::::

如何在c# Regex中使用lookbehind来删除换行符?

非正则表达式

逐行读取文件。检查第一行,如果它等于StopService::,不要在它后面添加换行符(Environment.Newline)。


<标题> Regex方式

您可以使用(?<=^[^:]*::)后看匹配第一个::之后的换行符:

var str = "StopService::'r'n697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to'r'nA@gmail.com::0::::";
var rgx = new Regex(@"(?<=^[^:]*::)['r'n]+");
Console.WriteLine(rgx.Replace(str, string.Empty));
输出:

StopService::697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to
A@gmail.com::0::::

参见IDEONE demo

回溯((?<=...))匹配:

  • ^ -起始字符串
  • [^:]* -除:以外的0个或更多字符
  • :: - 2冒号

['r'n]+模式确保我们匹配所有换行符,即使有多个换行符

试试这个:

Regex.Replace(yourtext, @"(?<=[::])['r'n|'n|'r]", string.empty);

你看后面的想法是对的。但是你需要寻找一个换行符和/或/两个回车符…

这是我的快速尝试。它可能需要一些调整,因为我刚刚设置了两条记录作为输入。

方法是定义一个Regex来标识标题、换行符和细节(可能包括换行符)。然后,只需运行一个replace命令,将header与detail放回一起,抛出header/detail换行符。

RegexOptions。IgnorePatternWhitespace选项用于允许表达式中出现空白,以提高可读性。

var text = "StopService::" + Environment.NewLine;
text += "697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to" + Environment.NewLine;
text += "A@gmail.com::0::::"  + Environment.NewLine;
text += "StopService::" + Environment.NewLine;
text += "697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to" + Environment.NewLine;
text += "A@gmail.com::0::::"  + Environment.NewLine;
var options = RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace;
var matchRegex = new Regex("(?<header>''w+?::) ''r''n (?<detail>.+?::::)", options );
var replacement = "${header}${detail}";
var newText = matchRegex.Replace(text,replacement);

生产:

StopService::697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to
A@gmail.com::0::::
StopService::697::12::test::20::a@yahoo.com::20 Main Rd::Alcatraz::CA::1200::Please send me Information to
A@gmail.com::0::::

Javascript:

yourtext.replace(/('r'n|'n|'r)/gm," ");

我还没有测试过c#。它应该像下面这样工作:

c#:

Regex.Replace(yourtext, @"/('r'n|'n|'r)/gm", " ");