我要做的是使用正则表达式将文本框解析为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);
}
答案 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