2017-01-10 112 views
0

對於一個項目,我需要將字符串值分隔成一個字符串列表。 是建立如下的字符串:正則表達式排除字符串到數組的模式

string unprocessed = "\"foo,bar\",\"foobar\",\"shizzle ma nizzle\""; 

我想INT進入類似如下的數組:

string[] processed = [] { "\"foo,bar\"", "\"foobar\"", "\"shizzle ma nizzle\""}; 

爲此,使用正則表達式匹配系統,該代碼分離的IM 「,」字符組合。我到目前爲止的代碼如下:

Regex reg = new Regex(@"((?!(,""|"",)).)+"); 
string regmatch = "\"\"wubba,lubba\",\"dup dub\"\""; 
var matches = reg.Matches(regmatch); 

Assert.AreEqual(2, matches.Count); 
Assert.AreEqual("\"dup dub\"\"", matches[1].Value); // passes 
Assert.AreEqual("\"\"wubba,lubba\"", matches[0].Value); // fails because value = \"\"wubba,lubba 

到目前爲止,我得到一個微小的錯誤,如示例代碼所示。現在我在做東西,我快到了。有人可以幫我解決這個正則表達式問題嗎?還是有更好的方法來做到這一點?

+0

你爲什麼不乾脆用String .Split(String [],StringSplitOptions)? –

+0

@DavideVisentin和什麼應該作爲String []傳遞? –

+0

@SergeyBerezovskiy新字符串[] {「\,\」}。 –

回答

2

由於您的要求還要求您捕獲多個冗餘報價m在任何給定的子串方舟(爲什麼???)塞吉Berezovskly的圖案應產生的一個調整所期望的結果:

var processed = Regex.Matches(unprocessed, "\"+[^\"]+\"+") 
        .Cast<Match>() 
        .Select(m => m.Value) 
        .ToList(); 
+0

的第一個正確答案開始時他想要得到的'已處理的'樣本中缺少這個 – martijn

2

只要捕獲其中大約有報價和內部無報價符號序列:

var processed = Regex.Matches(unprocessed, "\"[^\"]+\"") 
        .Cast<Match>() 
        .Select(m => m.Value) 
        .ToArray(); 

輸出:

[ 
    "\"foo,bar\"", 
    "\"foobar\"", 
    "\"shizzle ma nizzle\"" 
] 

如果簡單枚舉是對你有好處,你可以用漂亮的簡單的查詢:

var processed = from Match m in Regex.Matches(unprocessed, "\"[^\"]+\"") 
       select m.Value; 
+0

你可以使用查詢語法來產生一個'List',並且通過圍繞在括號後跟'.ToList()' – Abion47

+0

當我用它來分隔「」「wubba,lubba」「,」「dub dub」「 「它給了我錯誤的wubba lubba和配音配音。查看我的示例代碼 – martijn

+0

另外,如果您只打算使用匹配而不使用組,則沒有理由在模式中使用分組語法。它返回模式字符串中沒有括號的完全相同的結果。 – Abion47

相關問題