如何在C#Regex中使用lookbehind以删除换行符?

时间:2015-06-02 17:12:04

标签: c# regex

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

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

我想删除标题和详细记录之间的换行符,以便将它们作为单个记录处理,因为详细记录可以包含换行符,我只需要删除直接跟在{后面的换行符{1}}签名。

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

::

我也试过这个:

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

在这种情况下,我知道如何使用正则表达式后视镜吗? 我的输出应该如下所示:

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

4 个答案:

答案 0 :(得分:2)

非正则表达方式

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

正则表达方式

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

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]+模式确保我们匹配所有换行符号,即使有多个换行符号也是如此。

答案 1 :(得分:1)

试试这个:

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

你走在正确的轨道上,看起来很棒。但是你需要寻找一个新行和/或/两个回车...

答案 2 :(得分:1)

这是我的快速尝试。它可能需要一些调整,因为我只是为了输入而记录了两个记录。

方法是定义一个标识标题,换行符和细节的正则表达式(可能包括换行符)。然后,只需运行一个替换,将标题与细节重新放在一起,抛出标题/细节换行符。

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::::

答案 3 :(得分:0)

Javascript:

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

我没有测试过C#one。它应该像下面这样工作。

C#:

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