C# 解析文本框并将一个组转换为另一个组的百分比

C# 解析文本框并将一个组转换为另一个组的百分比,c#,regex,parsing,C#,Regex,Parsing,我试图做的是使用正则表达式将文本框解析为3组。它是一个数学表达式,分为3组。表达式最初为字符串格式,但将转换为整数以执行计算,然后再转换回字符串。组1包含整数。第2组 包含操作数,组3包含整数 这是一个计算器应用程序,所以点击按钮(百分比按钮),我想将第3组转换为第1组的百分比 这是我尝试过的,但不起作用。我错过了什么 文本框中的表达式如下所示: 2 + 3 2 * 3 2 / 3 2 - 3 我想把每个表达式中的“3”转换成2的3%。 然后显示更改: 2 + 0.06 2 * 0.

我试图做的是使用正则表达式将文本框解析为3组。它是一个数学表达式,分为3组。表达式最初为字符串格式,但将转换为整数以执行计算,然后再转换回字符串。组1包含整数。第2组 包含操作数,组3包含整数

这是一个计算器应用程序,所以点击按钮(百分比按钮),我想将第3组转换为第1组的百分比

这是我尝试过的,但不起作用。我错过了什么

文本框中的表达式如下所示:

2 + 3 
2 * 3 
2 / 3 
2 - 3 
我想把每个表达式中的“3”转换成2的3%。 然后显示更改:

2 + 0.06 
2 * 0.06 
2 / 0.06 
2 - 0.06 
String Expression=richTextBox1.Text;
Regex Regex=new Regex(@“([\+-]?\d+\.*\d*[eE][\+-]?\d+\+]?\d+\+]?\d+\.*\d*)([\/\*\+\+-](?\d+\.\d*[eE][\+-]?\d+\.-\d*)”);
Match m=regEx.Match(表达式);
while(m.Success)
{
double result=Convert.ToDouble(m.Groups[3].Value);
结果=Convert.ToDouble(m.Groups[1].Value)/100;
如果((结果<0)| |(m.Index==0))
Expression=regEx.Replace(表达式,result.ToString(),1);
其他的
表达式=regEx.Replace(表达式“+”+结果,1);
m=正则表达式匹配(表达式);
}

我认为编写公式解析器不在这个问题的范围之内。我只能说明当前方法的问题所在

首先,您没有考虑值之间的空白。 第二,您将整个表达式替换为它的一部分。 第三,你们使用几个作业来获得结果,但我们只对第三组感兴趣

下面是“修复”代码:替换回调方法

public static string Repl(Match m)
{
    double result = Convert.ToDouble(m.Groups[3].Value);
    result = Convert.ToDouble(m.Groups[3].Value) / 100 * 2;
    if (result < 0 || m.Index == 0)
       return m.Value.Replace(m.Groups[3].Value, result.ToString());
    else 
       return m.Value.Replace(m.Groups[3].Value, "+" + result.ToString());
}
当然,您可以将此回调方法转换为lambda表达式


请参见

如果您只是转换表达式中的第二个数字,那么这个问题的范围似乎并不太难。我将使用带有以下模式的
Regex.Split()

"([-+/*])"
这将表达式拆分为三部分:

  • 第一个数字
  • 接线员
  • 第二个数字
然后只需将第二个数字转换为2的3%,并
String.Join()

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        List<string> expressions = new List<string>
        {
            "2 + 3", 
            "2 * 3", 
            "2 / 3", 
            "2 - 3" 
        };

        Console.WriteLine("Before: ");
        expressions.ForEach(Console.WriteLine);
        Console.WriteLine();

        for (int i = 0; i < expressions.Count; i++)
        {
            string[] pieces = Regex.Split(expressions[i], "([-+/*])")
                .Select((p, j) => j == 2 ? (2 * 0.03).ToString() : p.Trim())
                .ToArray();
            expressions[i] = String.Join(" ", pieces);
        }

        Console.WriteLine("After: ");
        expressions.ForEach(Console.WriteLine);
        Console.WriteLine();
    }
}

您能发布一个您试图解析的文本示例吗?哪个部分不起作用?您在计算中未使用组2或组3,您在计算中仅使用组1。为什么不直接要求用户输入组1的输入呢?不知道你想做什么,但是你的正则表达式不能正确匹配int/float。这可能更好(没有空格)
@([+-]?(?:\d+(?:\.\d*)?\.\d+([eE][+-]?\d+)([/*+-])([+-])((?:\d+(?:\.\d*)([eE][+-]?\d+)”
文本框中的表达式看起来像:2+3或2*3或2-3,我想将每个表达式中的“3”转换为2的3%。然后显示更改:2+0.06或2*0.06或2/0.06或2-0.06我从来不敢编写自己的公式解析器。尽管如此,如果我愿意,我不会使用正则表达式。相反
"([-+/*])"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        List<string> expressions = new List<string>
        {
            "2 + 3", 
            "2 * 3", 
            "2 / 3", 
            "2 - 3" 
        };

        Console.WriteLine("Before: ");
        expressions.ForEach(Console.WriteLine);
        Console.WriteLine();

        for (int i = 0; i < expressions.Count; i++)
        {
            string[] pieces = Regex.Split(expressions[i], "([-+/*])")
                .Select((p, j) => j == 2 ? (2 * 0.03).ToString() : p.Trim())
                .ToArray();
            expressions[i] = String.Join(" ", pieces);
        }

        Console.WriteLine("After: ");
        expressions.ForEach(Console.WriteLine);
        Console.WriteLine();
    }
}
Before: 
2 + 3
2 * 3
2 / 3
2 - 3

After: 
2 + 0.06
2 * 0.06
2 / 0.06
2 - 0.06