簡體   English   中英

Regex.Split()奇怪的行為

[英]Regex.Split() strange behaviour

我嘗試使用正則表達式將數據拆分到文本文件中,但我在測試過程中發現了一個奇怪的錯誤 - 非常簡單的文件顯然是錯誤的。 用於說明此類行為的示例代碼:

        const string line = "511525,3122,9,39,2007,9,39,3127,9,39,\" -49,368.11 \",\"-32,724.16\",2,1,\" 2,347.91 \", -   ,\" 2,234.17 \", -   ,2.2,1.143,2,1.24,FALSE,1,2,0,311,511625";
        const string pattern = ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";

        Console.WriteLine();
        Console.WriteLine("SPLIT");
        var splitted = Regex.Split(line, pattern, RegexOptions.Compiled);
        foreach (var s in splitted)
        {
            Console.WriteLine(s);
        }

        Console.WriteLine();
        Console.WriteLine("REPLACE");
        var replaced = Regex.Replace(line, pattern, "!" , RegexOptions.Compiled);
        Console.WriteLine(replaced);

        Console.WriteLine();
        Console.WriteLine("MATCH");
        var matches = Regex.Matches(line, pattern);
        foreach (Match match in matches)
        {
            Console.WriteLine(match.Index);
        }

所以,正如你所看到的,split是產生意外結果的唯一方法(它在無效位置上分裂!)! MatchesReplace給出了絕對正確的結果。 我甚至試圖在RegexBuddy中測試提到的正則表達式,它顯示與Regex.Matches相同的匹配! 我錯過了什么或看起來像Split方法中的錯誤?

控制台輸出

SPLIT
511525
, -   ," 2,234.17 "
3122
, -   ," 2,234.17 "
9
, -   ," 2,234.17 "
39
, -   ," 2,234.17 "
2007
, -   ," 2,234.17 "
9
, -   ," 2,234.17 "
39
, -   ," 2,234.17 "
3127
, -   ," 2,234.17 "
9
, -   ," 2,234.17 "
39
, -   ," 2,234.17 "
" -49,368.11 "
, -   ," 2,234.17 "
"-32,724.16"
, -   ," 2,234.17 "
2
, -   ," 2,234.17 "
1
, -   ," 2,234.17 "
" 2,347.91 "
 -   ," 2,234.17 "
 -
" 2,234.17 "
" 2,234.17 "
 -
2.2
1.143
2
1.24
FALSE
1
2
0
311
511625

REPLACE
511525!3122!9!39!2007!9!39!3127!9!39!" -49,368.11 "!"-32,724.16"!2!1!" 2,347.91 "! -   !" 2,234.17 "! -   !2.2!1.143!2!1.24!FALSE!1!2!0!311!511625

MATCH
6
11
13
16
21
23
26
31
33
36
51
64
66
68
81
87
100
106
110
116
118
123
129
131
133
135
139

來自MS的解決方案

(添加ExplicitCapture正則表達式選項)

根據您對Microsoft的回復(添加ExplicitCapture),問題似乎是捕獲組。 ExplicitCapture選項會將捕獲組轉換為非捕獲組

您可以通過使組明確不捕獲來執行相同的操作:

const string pattern = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)";

其中,用LINQPad測試,似乎產生了結果正在尋找。

是否有任何捕獲組會產生差異,如Regex.Split的文檔中所述

如果在Regex.Split表達式中使用捕獲括號,則任何捕獲的文本都包含在結果字符串數組中。 例如,將字符串“plum-pear”拆分到捕獲括號內的連字符上會將包含連字符的字符串元素添加到返回的數組中。

暫無
暫無

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

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