用字母变量替换数学方程中的浮点数

时间:2018-06-12 20:47:11

标签: c# regex

我想用正则表达式用字母替换数学表达式中的所有浮点数。这就是我尝试过的:

Regex rx = new Regex("[-]?([0-9]*[.])?[0-9]+");
string expression = "((-30+5.2)*(2+7))-((-3.1*2.5)-9.12)";
char letter = 'a';
while (rx.IsMatch(expression))
{
    expression = rx.Replace(expression , letter.ToString(), 1);
    letter++;
}

问题在于,如果我有例如(5-2)+3,则会将其替换为:(ab)+c

所以它得到-2作为数字,但我不想要那个。

我对Regex没有经验,但我认为我需要这样的事情:

检查' - ',如果有,请检查前面是否有数字或右括号。如果有 NOT ,请保存“ - ”。 之后检查数字 + + 数字

我的上述正则表达式也适用于以下值: .2 .3 .4 但我不需要,它应该是明确的: 0.2 0.3 0.4

1 个答案:

答案 0 :(得分:2)

遵循建议的逻辑,您可以考虑

(?:(?<![)0-9])-)?[0-9]+(?:\.[0-9]+)?

请参阅regex demo

正则表达式详细信息

  • (?:(?<![)0-9])-)? - 一个可选的非捕获组,匹配1或0次出现
    • (?<![)0-9]) - 字符串中不会立即显示)或数字
    • 的地方
    • - - 减号
  • [0-9]+ - 1+位数
  • (?:\.[0-9]+)? - 一个可选的非捕获组,匹配1个或0个.后跟1+个数字。

在代码中,最好使用匹配评估程序(请参阅C# demo online):

Regex rx = new Regex(@"(?:(?<![)0-9])-)?[0-9]+(?:\.[0-9]+)?");
string expression = "((-30+5.2)*(2+7))-((-3.1*2.5)-9.12)";
char letter = (char)96; // char before a in ASCII table
string result = rx.Replace(expression, m => 
    {
        letter++;       // char is incremented
        return letter.ToString();
    }
);
Console.WriteLine(result); // => ((a+b)*(c+d))-((e*f)-g)