C# - 使用正则表达式删除字符

时间:2017-03-11 11:43:30

标签: c# regex

我有一个文本文件,我需要删除一些尾随分隔符。文本文件如下所示:

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"

所以我认为最好的方法是进行正则表达式替换?任何人都可以帮我这个正则表达式吗?

由于

2 个答案:

答案 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);

示例:http://ideone.com/PTdsg5

强烈建议反对使用它...解释原因...尝试理解正则表达式。如果你能理解它,那么你可以使用它: - )

我会编写一个简单的状态机,计算'并在计数|为奇数时替换'

答案 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));