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

时间:2015-07-29 14:34:38

标签: c# regex parsing

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

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

这是我尝试过的但是没有用。我错过了什么?

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

2 + 3 
2 * 3 
2 / 3 
2 - 3 

我想转换" 3"在每个表达式中为3%的2。 然后显示更改:

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*[eE][\+-]?\d+|-?\d+\.*\d*)");

Match m = regEx.Match(Expression);

while (m.Success)
{
    double result = Convert.ToDouble(m.Groups[3].Value);
    result = Convert.ToDouble(m.Groups[1].Value) / 100;
    if ((result < 0) || (m.Index == 0)) 
        Expression = regEx.Replace(Expression, result.ToString(), 1);
    else 
        Expression = regEx.Replace(Expression, "+" + result, 1);
    m = regEx.Match(Expression);
}

2 个答案:

答案 0 :(得分:1)

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

首先,您没有考虑值之间的空格。 其次,你只用一部分替换了整个表达式。 第三,你为结果使用了几个作业,但我们只对第3组感兴趣。

这是&#34;修复&#34;代码:替换回调方法......

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());
}

这就是我们如何称呼它:

String Expression = "2 * 3";
Regex regEx = new Regex(@"([+-]?\d+\.*\d*[eE][+-]?\d+|[-+]?\d+\.*\d*)\s*([/*+-])\s*(-?\d+\.*\d*[eE][+-]?\d+|-?\d+\.*\d*)");
Expression = regEx.Replace(Expression,Repl);
Console.WriteLine(Expression);

当然,您可以将此回调方法转换为lambda表达式。

请参阅IDEONE demo

答案 1 :(得分:0)

如果你只是转换表达式中的第二个数字,这个问题的范围似乎并不太难。我会使用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();
    }
}

结果:

Before: 
2 + 3
2 * 3
2 / 3
2 - 3

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

Fiddle Demo