C# 使用正则表达式拆分带引号的子字符串

C# 使用正则表达式拆分带引号的子字符串,c#,regex,C#,Regex,我正在尝试使用正则表达式匹配以下文本 "1bbl" 2bbl "is as" 0.22 "3" 当我匹配时,我没有得到列表中预期的输出 string val = "\"1bbl\" 2bbl \"is as\" 0.22 \"3\""; var reg = new Regex(@"([a-z0-9\s]+)"); Match match = reg.Match(val); List<string> list = new List<string>(); while (ma

我正在尝试使用正则表达式匹配以下文本

"1bbl" 2bbl "is as" 0.22 "3"
当我匹配时,我没有得到列表中预期的输出

string val = "\"1bbl\" 2bbl \"is as\" 0.22 \"3\"";
var reg = new Regex(@"([a-z0-9\s]+)");
Match match = reg.Match(val);
List<string> list = new List<string>();
while (match.Success)
{
    list.Add(match.ToString());
    match = match.NextMatch();
}
预期产出:

"1bbl"
"2bbl"
"is as"
"0.22"
"3"

您还需要包括匹配十进制数的模式

System.Text.RegularExpressions.Regex(@"\b(?:\d+\.\d+|[a-z\s0-9]+)\b");
开头和结尾的
\b
有助于避免不必要的前导空格和尾随空格的匹配

您的正则表达式
([a-z0-9\s]+)
不捕获特殊字符。因此,它不捕获小数点

您可能希望在正则表达式中添加需要捕获的特殊字符。比如说,您需要允许捕获“@”、“#”和“.”,那么您的正则表达式将是:

System.Text.RegularExpressions.Regex(@"([a-z0-9\s@#\.]+)")

由于点“.”在正则表达式中有特殊的含义,我们需要使用反冲,因此“
\.
”。

因为它看起来像是将空格分隔的字符串与用作文本限定符的引号相匹配,所以您可能需要使用如下正则表达式:

@"""[^""]+""|[^""\s]+"
也就是说,尝试匹配任何文本字段,获取文本限定符(引号)
([^“]+)”
,否则,使用空格作为分隔符
([^“\s]+)
,获取所有内容

但是,如果不想在匹配中获得引号,可以使用命名捕获组,例如:

@"""(?<1>[^""]+)""|(?<1>[^""\s]+)"
@“(?[^”“]+)”|(?[^”“\s]+)

我已经编辑掉了与XML无关的引用-请随意还原。。。在任何一种情况下,请解释为什么
“是因为“
应该被选为字符串。谢谢..这几乎有效。但当我传递两个字符串时,比如2bbl 3bbl,我没有正确理解。列表应该有2个字符串,但1请查看它是否与这两个字符串都正确匹配。非常精确,我正在查找。谢谢
@"""(?<1>[^""]+)""|(?<1>[^""\s]+)"