如何在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::::
非正则表达式
逐行读取文件。检查第一行,如果它等于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", " ");