[英]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.