我正在使用一个使用%作为mod符号的数学解析器。我想将它用于百分号而不是允许用户键入“25%* 10”或“25%的10”并收到答案“2.5”(他们可以键入任何内容)。
然后我使用正则表达式获取“25%”(可以在字符串的任何部分)并进行简单的计算(25/100)然后用字符串中的25%替换要传递给数学解析器的计算值。基本上我在将完整字符串传递给数学解析器之前,对百分号前面的数字做了一些预计算。
我一直在与正则表达式斗争,并希望有人可以帮助我。
由于
答案 0 :(得分:6)
最简单的方法是让数学解析器进行划分:
s/([0-9.]+)%/($1\/100)/g
只是将“25%”替换为“(25/100)”...因此,如果用户输入“25%*10
”,他们现在将拥有“(25/100)*10
”,在评估时会给他们正确的答案。
或者,在Perl中,你可以这样做:
s{([0-9.]+)%}{$1/100}eg
将Perl计算除以100的除法并将其传递给数学解析器
答案 1 :(得分:1)
要在'%'符号前找到数字的正则表达式为/(\d+)%/
。
但是,数学表达式不是常规语言,因此正则表达式可能不是正确的工具。你应该告诉你的解析器将'%'解释为“取出之前的任何内容并将其除以100”。 “无论在此之前发生什么”都可以是任何数学表达式,并且您不会遇到运算符优先级问题。你可以在语法树解析器中对它们进行排序。
将文本替换与真实语言功能混合通常会违反最不惊讶的原则。当用户看到'%'将前面的内容除以100时,他可能会尝试使用(23+42)%
之类的表达式,但这只会产生语法错误。此外,如果你有1.34e-14%
这样的东西,你需要一个更精细的正则表达式,但是这些东西只会在你使用树解析器时自行解决。