我有一个等式写成:
第一个公式:(0.085+4.346*10^-5*((a^2)-(0^2))+0.0017228*(a-(0)))*2
系数是:
1)0.085
2)4.346 * 10 ^ 5
3)0.0017228
第二个公式:((0.208+0*d^3-0.00000434*d^2-0.00203*d)*2)
系数是:
1)0.208
2)0
3)-0.00000434
4)-0.00203
从上面提到的公式中,我需要一个用C#编写的正则表达式来获取上述系数。
我尝试了正则表达式:"[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?"
会返回良好的系数s,但不会返回上面第二个公式中提到的'0'。
我尝试了以下代码:
string p = @"((0.208+0*d^3-0.00000434*d^2-0.00203*d)*2)";
var result = Regex.Matches(p, @"[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?").Cast<Match>().Select(m => m.Value).Where((x, i) => i % 2 == 0).ToList();
foreach(string item in result)
{
Console.WriteLine(item);
}
以上代码的结果:
0.208
-0.00000434
-0.00203
(这里缺少0,因为它是第二系数。)
答案 0 :(得分:0)
所需的输出,尤其是4.346*10^5
,会使该表达式过于复杂,即使您的原始表达式很好,我也认为RegEx不够好。然后,我们将其简化为:
-?[0-9]*(?:\.?[0-9]+)?(?:[eE][-+]?[0-9]+)?
,希望您可能会弄清楚如何输出4.346*10^5
或处理/绕过它。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"-?[0-9]*(?:\.?[0-9]+)?(?:[eE][-+]?[0-9]+)?";
string input = @"0.085+4.346*10^-5*((a^2)-(0^2))+0.0017228*(a-(0)))*2
0.208+0*d^3-0.00000434*d^2-0.00203*d)*2)";
RegexOptions options = RegexOptions.Multiline;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}
在this demo的右上角对表达式进行了说明,如果您想探索/简化/修改它,在this link中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。