我有一个看起来像这样的字符串:
-2.2,1.1-6.9,2.3-12.8,2.3
我想写一个函数ParseString(),它会返回带有这些元素的双精度列表:
-2.2
1.1
-6.9
2.3
-12.8
2.3
我遇到的问题是减号的作用类似于分隔符,但也具有语义含义(表示负数)。我对正则表达式缺乏经验,我坚持这个。任何专家可以帮我解决这个问题吗?我是用C#写的。
答案 0 :(得分:6)
您可以拆分正则表达式,|(?<!^|,)(?=-)
经过测试的例子:
var splitter = new Regex(@",|(?<!^|,)(?=-)");
var numbers = splitter.Split(@"-2.2,1.1-6.9,2.3,-12.8,2.3")
.Select(Double.Parse);
此正则表达式与,
或(?<!^|,)(?=-)
匹配。
(?!^)(?=-)
是一对零宽度断言,在-
之前匹配,不在字符串的开头或逗号之后。
(?<!^|,)
是一个负面的lookbehind,阻止它在字符串或逗号开头后匹配。如果没有这种否定,它将返回额外的空字符串
(?=-)
是一个积极的先行,迫使它在-
之前匹配。
答案 1 :(得分:5)
一个简单的解决方案(不是最有效的)是首先用“, - ”替换“ - ”,然后拆分“,”,最后解析部分。像这样:
string numStr = "-2.2,1.1-6.9,2.3-12.8,2.3";
string[] splitNumStr = numStr.Replace("-", ",-").Split(',');
List<double> nums = splitNumStr.Select(s => double.Parse(s)).ToList();
答案 2 :(得分:0)
此正则表达式适用于我:(-*\d*\.\d*)|(-\d*\.\d*-\d*\.\d*)