簡體   English   中英

C#-使用正則表達式刪除字符

[英]C# - Remove characters with 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";

我要刪除字符“ |” 在字符串“ Nguyen Van | A”和“ Nguyen | Van B”中

因此,我認為最好的方法是更換正則表達式? 誰能幫我這個正則表達式?

謝謝

正則表達式應為:

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

多線使用...所以

var rx = new Regex(@"(?<=^[^']*'([^']*'[^']*')*[^']*)\|", RegexOptions.Multiline);

string text = @"1|'Nguyen Van| A'|'Nguyen Van A'|39

2 |'Nguyen Van B'|'Nguyen | Van B'| 39“;

string replaced = rx.Replace(text, string.Empty);

示例: http//ideone.com/PTdsg5

強烈建議不要使用它。解釋原因。嘗試理解正則表達式。 如果您可以理解它,則可以使用它:-)

我將編寫一個簡單的狀態機,該狀態機計算'並替換| 當計數的'是奇數。

您提到使用多行正則表達式花費的時間太長,並詢問有關狀態機的方法。 因此,這里是一些使用函數執行操作的代碼(請注意,該函數可能需要使用一些清理功能,但它可以顯示出這種想法並且比regex更快地工作)。 在我的測試中,使用不帶多行的正則表達式,我可以在大約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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM