我有一个文本文件,我需要删除一些尾随分隔符。文本文件如下所示:
string text = @"1|'Nguyen Van| A'|'Nguyen Van A'|39
2|'Nguyen Van B'|'Nguyen| Van B'|39";
string result = @"1|'Nguyen Van A'|'Nguyen Van A'|39
2|'Nguyen Van B'|'Nguyen Van B'|39";
我想删除char" |"在字符串" Nguyen Van | A"和" Nguyen |范B"
所以我认为最好的方法是进行正则表达式替换?任何人都可以帮我这个正则表达式吗?
由于
答案 0 :(得分:1)
正则表达式应该是:
(?<=^[^']*'([^']*'[^']*')*[^']*)\|
要使用Multiline ......所以
var rx = new Regex(@"(?<=^[^']*'([^']*'[^']*')*[^']*)\|", RegexOptions.Multiline);
string text = @"1|'Nguyen Van| A'|'Nguyen Van A'|39
2 |'Nguyen Van B'|'Nguyen |范B'| 39“;
string replaced = rx.Replace(text, string.Empty);
我强烈建议反对使用它...解释原因...尝试理解正则表达式。如果你能理解它,那么你可以使用它: - )
我会编写一个简单的状态机,计算'
并在计数|
为奇数时替换'
。
答案 1 :(得分:0)
您提到使用多行正则表达式花了太长时间并询问状态机方法。所以这里有一些代码使用函数来执行操作(注意,该函数可能使用一点清理,但它显示了这个想法并且比正则表达式工作得更快)。在我的测试中,使用没有多行的正则表达式,我可以在大约34秒内处理1,000,000行(在内存中,而不是写入文件)。使用状态机方法大约需要4秒钟。
string RemoveInternalPipe(string line)
{
int count = 0;
var temp = new List<char>(line.Length);
foreach (var c in line)
{
if (c == '\'')
{
++count;
}
if (c == '|' && count % 2 != 0) continue;
temp.Add(c);
}
return new string(temp.ToArray());
};
File.WriteAllLines(@"yourOutputFile",
File.ReadLines(@"yourInputFile").Select(x => RemoveInternalPipe(x)));
要将性能与Regex
版本进行比较(不使用多行选项),您可以运行以下代码:
var regex = new Regex(@"(?<=^[^']*'([^']*'[^']*')*[^']*)\|");
File.WriteAllLines(@"yourOutputFile",
File.ReadLines(@"yourInputFile").Select(x => regex.Replace(x, string.Empty));