C# 解析文本框并将一个组转换为另一个组的百分比
我试图做的是使用正则表达式将文本框解析为3组。它是一个数学表达式,分为3组。表达式最初为字符串格式,但将转换为整数以执行计算,然后再转换回字符串。组1包含整数。第2组 包含操作数,组3包含整数 这是一个计算器应用程序,所以点击按钮(百分比按钮),我想将第3组转换为第1组的百分比 这是我尝试过的,但不起作用。我错过了什么 文本框中的表达式如下所示: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.
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()
:
"([-+/*])"
这将表达式拆分为三部分:
- 第一个数字
- 接线员
- 第二个数字
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