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();