[英]Replace string using Regex replace pattern
基本上我正在處理CSV文件,並在C#中逐行讀取它。 我有一個字符串輸入(一行),試圖找到一個正則表達式模式並使用另一個正則表達式模式替換它,但是結果不是我期望的。
var input = "\"efgh ,ijkl123,\",abcd , \"efgh ,ijkl123,\",mnop456 \"efgh ,ijkl123,\"";
在輸出中,我需要用分號替換雙引號之間的內部逗號,其中雙引號位於逗號之間。
在雙引號和外部逗號(雙引號對之間的逗號)之間,只能是空格。
所以我希望輸出為: "efgh ;ijkl123,",abcd , "efgh ;ijkl123,",mnop456 "efgh ,ijkl123,"
我的代碼:
var pattern = @".*,\s*""(.*,+.*)+""\s*,.*";
var replacePattern = @".*,\s*""(.*;+.*)+""\s*,.*";
if (Regex.IsMatch(input, pattern))
{
var output = Regex.Replace(input, pattern, replacePattern);
}
但運行我的代碼,輸出為:。 ,\\ s “( 。; +。 )+” \\ s *,。*,它是replacePattern。
按預期編輯更多輸入樣本和輸出:
輸入abcd , "efgh ,ijkl123,",mnop456
輸出abcd , "efgh ;ijkl123;",mnop456
輸入"efgh ,ijkl123,",abcd , "efgh ,ijkl123,",mnop456 "efgh ,ijkl123,"
輸出"efgh ;ijkl123;",abcd , "efgh ;ijkl123;",mnop456 "efgh ,ijkl123,"
輸入,"efgh ,ijkl123,",abcd" , "efgh ijkl123,",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456
輸出,"efgh ;ijkl123;",abcd" , "efgh ijkl123;",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456
輸入,"efgh" ,ijkl123,",abcd" , "efgh ijkl123,",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456
輸出,"efgh" ,ijkl123,";abcd" , "efgh ijkl123;",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456
輸入efgh ,ijkl123,",abcd , "efgh ,ijkl123,",mnop456 "efgh ,ijkl123,"
輸出efgh ,ijkl123,",abcd , "efgh ;ijkl123;",mnop456 "efgh ,ijkl123,"
好吧,這有點棘手,我敢肯定有人會建議比我的更好的正則表達式。 假設您輸入的文字是:
"efgh ,ijkl123,",abcd , "efgh ,ijkl123,",mnop456 "efgh ,ijkl123,"
你可以試試:
var data = "\"efgh ,ijkl123,\",abcd , \"efgh ,ijkl123,\",mnop456 \"efgh ,ijkl123,\"";
var rx = @"(?<=(^|,[ \t]*))\""[^\""\n]+\""(?=[ \t]*(,|$))";
var matches = Regex.Matches (data, rx);
foreach (Match match in matches) {
data = new Regex (match.Value).
Replace(data, match.Value.Replace (',', ';'), 1);
}
Console.WriteLine (data);
它將發出:
"efgh ;ijkl123;",abcd , "efgh ;ijkl123;",mnop456, "efgh ,ijkl123,"
上面的代碼基本上替換所有,
用雙引號之間昏迷;
半冒號。
不確定它是否非常有效,但是可以。 歡迎提出進一步改進的建議。
string input = "\"efgh ,ijkl123,\",abcd , \"efgh ,ijkl123,\",mnop456 \"efgh ,ijkl123,\"";;
Regex.Matches(input, "\"([^\"]*)\"(,)") // Extract string between quotes followed by ','.
.Cast<Match>()
.ToList()
.ForEach(m=> input = input.Replace(m.Value, m.Value.Replace(",",";")) // for each match replace with ';' inserted match.
.Replace(";\";",",\",")); // a hack, should have done it better
:
"efgh ;ijkl123,",abcd , "efgh ;ijkl123,",mnop456 "efgh ,ijkl123,"
工作Demo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.