我正在尝试使用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"
答案 0 :(得分:0)
您还需要包含匹配十进制数的模式。
System.Text.RegularExpressions.Regex(@"\b(?:\d+\.\d+|[a-z\s0-9]+)\b");
\b
在开头和结尾有助于避免匹配不必要的前导和尾随空格。
答案 1 :(得分:0)
您的正则表达式([a-z0-9\s]+)
不会捕获特殊字符。因此,它不会捕获小数点。
您可能希望在正则表达式中添加需要捕获的特殊字符。说,你需要允许'@','#'和'。'要被捕获,那么你的正则表达式将是:
System.Text.RegularExpressions.Regex(@"([a-z0-9\s@#\.]+)")
从点'。'在正则表达式中有特殊含义,我们需要使用反弹,因此“\.
”。
答案 2 :(得分:0)
由于您将空格分隔的字符串与用作文本限定符的引号相匹配,因此您可能希望使用如下所示的正则表达式:
@"""[^""]+""|[^""\s]+"
也就是说,尝试匹配任何文本字段,抓取文本限定符(引号)""([^""]+)""
内的所有内容,否则,使用空格作为分隔符([^""\s]+)
来抓取所有内容。
虽然如果您不想在匹配中获取引号,您可以使用命名捕获组,例如:
@"""(?<1>[^""]+)""|(?<1>[^""\s]+)"