簡體   English   中英

使用正則表達式替換模式替換字符串

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

按預期編輯更多輸入樣本和輸出:

  1. 輸入abcd , "efgh ,ijkl123,",mnop456

    輸出abcd , "efgh ;ijkl123;",mnop456

  2. 輸入"efgh ,ijkl123,",abcd , "efgh ,ijkl123,",mnop456 "efgh ,ijkl123,"

    輸出"efgh ;ijkl123;",abcd , "efgh ;ijkl123;",mnop456 "efgh ,ijkl123,"

  3. 輸入,"efgh ,ijkl123,",abcd" , "efgh ijkl123,",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456

    輸出,"efgh ;ijkl123;",abcd" , "efgh ijkl123;",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456

  4. 輸入,"efgh" ,ijkl123,",abcd" , "efgh ijkl123,",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456

    輸出,"efgh" ,ijkl123,";abcd" , "efgh ijkl123;",mnop456 "efgh ,ijkl123,","efgh ,ijkl123,"mnop456

  5. 輸入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.

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