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

C#-使用正则表达式删除字符,c#,regex,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"; 我想删除

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

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";
我想删除字符串“Nguyen Van | A”和“Nguyen | Van B”中的字符“|”

所以我认为最好的方法是用正则表达式替换?有人能帮我弄一下这个正则表达式吗

谢谢

正则表达式应该是:

(?<=^[^']*'([^']*'[^']*')*[^']*)\|
例如:

我强烈地建议反对使用它。。。来解释为什么。。。试着理解正则表达式。如果你能理解它,那么你就可以使用它:-)


我将编写一个简单的状态机,当计数的
是奇数时,计算
并替换

您提到的使用多行正则表达式花费的时间太长,并且询问了状态机方法。下面是一些使用函数执行操作的代码(注意,该函数可能需要一些清理,但它显示了这个想法,并且比正则表达式工作得更快)。在我的测试中,使用不带多行的正则表达式,我可以在大约34秒内处理1000000行(在内存中,而不是写入文件)。使用状态机方法大约需要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)));

因此,您有一个以管道分隔的文本文件,并且在引用条目时允许条目中包含管道?我理解对了吗?你也可以使用第三方库吗?我会手工编写,而不是与正则表达式对抗。。。最后,它是一个简单的状态机。
BULK INSERT Product FROM'D:\Product.data'WITH(FIELDTERMINATOR='|',rowdterminator='\n')我使用大容量插入SQL Server导入文件,但在这些字段中有错误。大容量加载数据转换错误(指定代码页的类型不匹配或无效字符)。亲爱的xanatos,目前我在两个系统的数据接口中,因此所有内容都是自动导入/导出的。Thanks@Nguyễ我现在也有点困惑。您在代码中这样做是为了准备大容量插入文件吗?默认字段引号字符为
那么您可能会遇到其他问题,而不仅仅是无关的管道字符?如果您编写问题说明实际问题而不是建议的解决方法,可能会更好,因为有可能更好的方法来解决它。因为大容量插入命令不接受这些记录。我需要在使用大容量插件之前清洁它。这个解决方案解决了我遇到的问题。但是,对于大型文件数据,该过程会运行很长时间。你有更好的办法吗?例如,内容的remove char |以字符串|开头,以字符串|而不是counts结尾,并在counted为奇数时替换|。@NguyễnQuang-您应该将此作为一个新问题发布,并确保将相关代码(即如何打开和解析文件、在何处调用regex.Replace以及如何编写新文件)发布到该问题。感谢您在此处寻找解决方案:@Nguyễ请用你正在使用的代码发布一个新问题。我假设您正在加载整个文件,并使用这个带有多行模式的正则表达式。发布新问题,我可以发布答案来帮助你。
string replaced = rx.Replace(text, string.Empty);
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)));
var regex = new Regex(@"(?<=^[^']*'([^']*'[^']*')*[^']*)\|");
File.WriteAllLines(@"yourOutputFile",
    File.ReadLines(@"yourInputFile").Select(x => regex.Replace(x, string.Empty));