使用正则表达式将字符串与带引号的子字符串分开

时间:2015-03-20 05:58:44

标签: c# regex

我正在尝试使用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 (match.Success)
{
    list.Add(match.ToString());
    match = match.NextMatch();
}

当前输出:

"1bbl"
" 2bbl "
"is as"
" 0"
"22 "
"3"

预期产出:

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

3 个答案:

答案 0 :(得分:0)

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

System.Text.RegularExpressions.Regex(@"\b(?:\d+\.\d+|[a-z\s0-9]+)\b");

\b在开头和结尾有助于避免匹配不必要的前导和尾随空格。

DEMO

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

由于您将空格分隔的字符串与用作文本限定符的引号相匹配,因此您可能希望使用如下所示的正则表达式:

@"""[^""]+""|[^""\s]+"

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

ideone demo

虽然如果您不想在匹配中获取引号,您可以使用命名捕获组,例如:

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

ideone demo