我想用正则表达式用字母替换数学表达式中的所有浮点数。这就是我尝试过的:
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
答案 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)