C# 在C中以特定字符串格式提取double的方法?

C# 在C中以特定字符串格式提取double的方法?,c#,string,C#,String,我们有格式为hello_EP_uuu-12.5_201414、welcome_EP_22.5_20345等的字符串输入 我们必须从上面的字符串中提取双精度值-12.5,22.5。格式*\u EP\u double\u*是固定的 提取的一种方法是将字符串与“u”分开,并将“EP”旁边的字符串转换为字符串。另一种方法是使用正则表达式,在这里我们提取小数部分。还有其他有效的方法吗?我总是喜欢用这个正则表达式从字符串中提取双精度数字 (-)?\d+\.\d+ 它没有任何像*\u EP\u double

我们有格式为hello_EP_uuu-12.5_201414、welcome_EP_22.5_20345等的字符串输入

我们必须从上面的字符串中提取双精度值-12.5,22.5。格式*\u EP\u double\u*是固定的


提取的一种方法是将字符串与“u”分开,并将“EP”旁边的字符串转换为字符串。另一种方法是使用正则表达式,在这里我们提取小数部分。还有其他有效的方法吗?

我总是喜欢用这个正则表达式从字符串中提取双精度数字

(-)?\d+\.\d+
它没有任何像*\u EP\u double这样的约束_*

但是在你的例子中,你想要提取后跟_EP_的double,在这个测试用例12.4345_hello_ES_34.5_4444中,你想要34.5,那么你必须使用

(?<=_EP_)(-)?\d+\.\d+

并不是说它更好,但我看不出类似的东西有什么问题:

 var parts = s.Split(new[] {"_EP_"}, StringSplitOptions.None);
 string dString = parts[1].Substring(0, parts[1].IndexOf('_'));
 double d = double.Parse(dString);
尝试:


定义得更好。你当前的代码是什么?为什么它不够?另一种不知道的方法是:找出它,然后找出它;取一个子字符串并解析为double另一种方法是使用regex,在这里我们提取十进制值部分。还有其他更好的方法吗?请删除regex标记..您已有的两个解决方案有什么问题吗?当前代码使用“\ux”拆分字符串。我的意思是,更好的方法是在可维护性、可靠性和效率方面,只要在此之前没有其他潜在的双重因素,这项工作就行了。它只返回第一个匹配项。不过,公平地说,根据OP的问题,这似乎不是一个有效的场景。您能为您的场景提供一个示例测试用例,说明此代码是错误的吗@考虑这两个字符串:12.4345_hello_ES_34.5_4444和_hello_ES_12.45_3333在一般情况下,您如何知道您要查找的匹配项?1号?第二名?第三个?是的,在他/她的情况下,你是对的,谢谢你的纠正。这是一个非常适合OP给出的精确字符串的例子。你应该试着使它对不遵循精确模式的字符串有效。OP指出,唯一固定的部分是“EP_double”,因此在使用LastIndexOf时,您不能真正依赖后面的内容。您没有抓住要点。我说的不是内容,而是模式。它是否适用于EP_99.999_toto_oops之后的更多内容?只要满足模式*_EL_double*,不管字符串包含什么,使其通常有效都很容易。
 string input = "hello_EP_-12.5_201414";
 int start = input.IndexOf("_EP_") + "_EP_".Length;
 int length = input.IndexOf('_', start + 1) - start;
 double d;            
 double.TryParse(input.Substring(start, length), out d);