C# 如果逗号不位于两个双引号之间,则按逗号拆分

C# 如果逗号不位于两个双引号之间,则按逗号拆分,c#,regex,C#,Regex,我希望用逗号拆分这样的字符串: field1:"value1", field2:"value2", field3:"value3,value4" 放入一个字符串[],如下所示: 0 field1:"value1" 1 field2:"value2" 2 field3:"value3,value4" 我试图用Regex.Split来实现这一点,但似乎无法计算出正则表达式。例如,用匹配来实现这一点要比用Split容易得多 string[] asYouWanted = R

我希望用逗号拆分这样的字符串:

 field1:"value1", field2:"value2", field3:"value3,value4"
放入一个
字符串[]
,如下所示:

0     field1:"value1"
1     field2:"value2"
2     field3:"value3,value4"

我试图用
Regex.Split
来实现这一点,但似乎无法计算出正则表达式。

例如,用
匹配来实现这一点要比用
Split
容易得多

string[] asYouWanted = Regex.Matches(input, @"[A-Za-z0-9]+:"".*?""")
    .Cast<Match>()
    .Select(m => m.Value)
    .ToArray();
string[]asyouwant=Regex.Matches(输入,@“[A-Za-z0-9]+:”“*”)
.Cast()
.选择(m=>m.Value)
.ToArray();
尽管如果您的值(或字段!)有可能包含转义引号(或任何类似的技巧),那么您最好使用合适的CSV解析器


如果您的值中确实有转义引号,我认为下面的正则表达式可以工作-对其进行测试:

@"field3:""value3\\"",value4""", @"[A-Za-z0-9]+:"".*?(?<=(?<!\\)(\\\\)*)"""

@“field3:“value3\\”,value4“”,@“[A-Za-z0-9]+:”“*”(?它在上停止匹配之前只有偶数个斜杠,因为奇数个斜杠意味着它被转义。

未经测试,但这应该可以:

string[] parts = string.Split(new string[] { ",\"" }, StringSplitOptions.None);
记住,如果需要,请在末尾添加“back”(返回)。

试试这个

// (\w.+?):"(\w.+?)"        
//         
// Match the regular expression below and capture its match into backreference number 1 «(\w.+?)»        
//    Match a single character that is a “word character” (letters, digits, and underscores) «\w»        
//    Match any single character that is not a line break character «.+?»        
//       Between one and unlimited times, as few times as possible, expanding as needed (lazy) «+?»        
// Match the characters “:"” literally «:"»        
// Match the regular expression below and capture its match into backreference number 2 «(\w.+?)»        
//    Match a single character that is a “word character” (letters, digits, and underscores) «\w»        
//    Match any single character that is not a line break character «.+?»        
//       Between one and unlimited times, as few times as possible, expanding as needed (lazy) «+?»        
// Match the character “"” literally «"»        


try {        
    Regex regObj = new Regex(@"(\w.+?):""(\w.+?)""");        
    Match matchResults = regObj.Match(sourceString);        
    string[] arr = new string[match.Captures.Count];        
    int i = 0;        
    while (matchResults.Success) {        
        arr[i] = matchResults.Value;        
        matchResults = matchResults.NextMatch();        
        i++;        
    }         
} catch (ArgumentException ex) {        
    // Syntax error in the regular expression        
}

按webnoob提到的
\,
拆分,然后使用select将后缀
转换为数组。

最简单的内置方式是。我检查了它。它工作正常。它将
“Hai,\“Hello,World\”
拆分为
{“Hai”,“Hello,World”}

你就不能拆分
吗,
在这种情况下?@webnoob这将删除尾部的
"
也一样,只是想在脑海中简单地说一下。@LukeHennerley-如果你知道它会丢失,那么如果需要的话,把它放回去也没什么大不了的。@webnoob确实是这样,只是在发布任何东西之前确保人们知道。不确定你是否可以用正则表达式来完成。但是扫描字符串并不难。从开头开始,然后再开始查找逗号。跟踪您当前是否处于带引号的字符串中。似乎Split无法将字符串[]作为参数,如何智能地不追加“关于Linq中的最后一项?@Franklin查看我的编辑,我想我缺少了
stringsplitoptions
参数。我不明白第二条评论是什么意思?你复制了regexbody解释并粘贴到这里了吗?我知道我知道俚语:D
string[] arr = str.Split(new string[] {"\","}}, StringSplitOptions.None).Select(str => str + "\"").ToArray();