我想从我的字符串中提取double。
buff = "VA VV_CELL1 3.55"
当我使用以下代码
private void GetLine(string msg, string buff, double numb)
{
comPort.WriteLine(msg);
Thread.Sleep(50);
buff = comPort.ReadExisting();
Thread.Sleep(50);
MatchCollection matches = Regex.Matches(buff, @".*?([-]{0,1} *\d+.\d+)");
List<double> doubles = new List<double>();
foreach (Match match in matches)
{
string value = match.Groups[1].Value;
value = value.Replace(" ", "");
doubles.Add(double.Parse(value));
Thread.Sleep(200);
numb = doubles[0];
}
}
这段代码适用于我的其他字符串,但“CELL1”包含一个数字,所以我没有得到想要的值“3.55”任何想法?
为什么你不简单地拆分这个字符串并采取最后一部分?
string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
另一种方法是使用Substring
和LastIndexOf
(如果没有空间则会失败):
string numberPart = buff.Substring(buff.LastIndexOf(' ')).Trim();
要帮助your comment:
我将使用一个返回double?
的方法(double可以为null):
double? GetNumber(string buff)
{
string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
if (validNum)
return num;
else
return null;
}
现在您可以使用该方法,甚至可以知道该数字是否可以成功解析:
double? result = GetNumber("VA VV_CELL1");
bool wasValid = result.HasValue;
if(wasValid)
{
double value = result.Value;
}
试试,这个正则表达式:\s+\d+(.)?\d+
我假设你想捕获双打和整数,否则你可以写\d+\.\d+
。这个 :
Regex.Matches("VA VV_CELL1 3.55",@"\d+\.\d+")[0]
返回3.55但无法捕获355。
您可以使用\s+\d+(\.\d+)?
捕获以空格开头的整数或小数。
Regex.Matches("VA VV_CELL1 3.55",@"\s+\d+(\.\d+)?")[0]
当时返回3.55
Regex.Matches("VA VV_CELL1 355",@"\s+\d+(\.\d+)?")[0]
返回355
如果您只想捕获最后一个字段,可以使用\s+\d+(\.\d+)?$
,例如:
Regex.Matches("VA VV_CELL1 3.54 3.55",@"\s+\d+(\.\d+)?$")[0]
返回3.55
你不需要修剪空格,因为double.Parse
忽略了它。您可以通过用括号括起数字来更改模式以在单独的组中捕获数字:
Regex.Matches("VA VV_CELL1 3.54 3.55",@"\s+(\d+(\.\d+)?)$")[0].Groups[1]
你需要使用Groups[1]
,因为第一组总是返回整个捕获