Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串c中提取双精度值#_C#_Regex - Fatal编程技术网

C# 从字符串c中提取双精度值#

C# 从字符串c中提取双精度值#,c#,regex,C#,Regex,我想从字符串中提取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

我想从字符串中提取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];                
    } 
}
private void GetLine(字符串msg、字符串buff、双重numb)
{
复合书写线(味精);
睡眠(50);
buff=comPort.ReadExisting();
睡眠(50);
MatchCollection matches=Regex.matches(buff,@.*?([-]{0,1}*\d+。\d+);
List doubles=新列表();
foreach(匹配中的匹配)
{
字符串值=匹配。组[1]。值;
值=值。替换(“,”);
doubles.Add(double.Parse(value));
睡眠(200);
麻木=双倍[0];
} 
}

这段代码适用于我的其他字符串,但“CELL1”包含一个数字,因此我无法获得想要的值“3.55”。有什么想法吗?

为什么不简单地拆分此字符串并获取最后一部分

string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
另一种方法是使用
Substring
LastIndexOf
(如果没有空格,则失败):


要在以下方面提供帮助:

我将使用一个方法返回一个
double?
(double可以为null):

现在,您可以使用该方法,甚至可以知道是否可以成功解析该数字:

double? result = GetNumber("VA VV_CELL1");
bool wasValid = result.HasValue;
if(wasValid)
{
   double value = result.Value;
}

你为什么不简单地把这根绳子分开,取最后一部分

string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
另一种方法是使用
Substring
LastIndexOf
(如果没有空格,则失败):


要在以下方面提供帮助:

我将使用一个方法返回一个
double?
(double可以为null):

现在,您可以使用该方法,甚至可以知道是否可以成功解析该数字:

double? result = GetNumber("VA VV_CELL1");
bool wasValid = result.HasValue;
if(wasValid)
{
   double value = result.Value;
}

Try,这个正则表达式:
\s+\d+(.)?\d+

Try,这个正则表达式:
\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]
,因为第一个组总是返回整个捕获

我假设您想要捕获双精度和整数,否则您可以编写
\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]
,因为第一组总是返回整个捕获

我不理解
线程的目标。在
foreach
循环中,睡眠
只需测试任何非数字字符的值(不包括小数分隔符)在解析之前,您总是希望从字符串中提取最后一个数字?我假设您希望捕获双精度和整数,否则您可以编写
\d+\.\d+
。您可以使用
\s+\d+(\.\d+)
捕获前面带有空格的十进制数。如果您只想捕获最后一个字段,
\s+\d+(\.\d+)$
我不明白
线程的目标。在
foreach
循环中,睡眠
只需测试任何非数字字符的值(十进制分隔符除外)在解析之前,您总是希望从字符串中提取最后一个数字?我假设您希望捕获双精度和整数,否则您可以编写
\d+\.\d+
。您可以使用
\s+\d+(\.\d+)
捕获前面带有空格的十进制数。如果只想捕获最后一个字段,
\s+\d+(\.\d+)?$
拆分会生成大量临时字符串,在解析大量记录时,这些字符串可能会非常昂贵。如果记录长度固定,行短或记录数少,则可以使用正则表达式overkill@PanagiotisKanavos:在OP的示例中,它生成3个临时字符串。我不认为这是太多的开销。但是,您也可以使用buff.Substring(buff.LastIndexOf(“”)).Trim()。一般来说,regex要贵得多,它帮了大忙@TimSchmelter`private void GetGet(string msg,string buff,double var){comPort.WriteLine(msg);Thread.Sleep(200);buff=comPort.ReadLine();Thread.Sleep(200);string numberPart=buff.Split().Last();double num;bool validNum=double.TryParse(numberPart,NumberStyles.Any,CultureInfo.InvariantCulture,out num);var=num;}`当我调用我的方法GetGet(“VA VV_CELL1”,buff1,var1)时,var1是0,为什么?@xBehemoth:你要么返回
num
,要么使参数
var
ref
。我更喜欢
双GetValue方法(字符串msg,字符串buff,双变量){…返回num;}
spliting生成大量临时字符串,在解析大量记录时,这些字符串的开销可能非常大。但是,如果记录长度固定,行短或记录数少,则可以使用正则表达式overkill@PanagiotisKanavos:在OP的示例中,它生成3个临时字符串。我认为这不会带来太多开销。但是,您也可以使用
buff.Substring(buff.LastIndexOf(“”)).Trim()
。通常,正则表达式的费用要高得多,它帮助了很多!@TimSchmelter`private void GetGet(string msg,string buff,double var)