0

我正在使用一个使用 % 作为 mod 符号的数学解析器。我想将它用于百分号,以允许用户输入“25%*10”或“25% of 10”并收到答案“2.5”(他们可以输入任何内容)。

然后我会使用要求的正则表达式来获取“25%”(可以在字符串的任何部分)并进行简单的计算(25 / 100),然后将字符串中的 25% 替换为计算值传递给数学解析器。基本上,在将完整字符串传递给数学解析器之前,我正在对百分比符号前面的数字进行一些预计算。

我一直在与正则表达式作斗争,并希望有人能帮助我。

谢谢

4

2 回答 2

6

最简单的方法是让数学解析器进行除法:

s/([0-9.]+)%/($1\/100)/g

这只是用“(25/100)”替换“25%”......所以如果用户输入“ 25%*10”他们现在将拥有“ (25/100)*10”,当评估时会给他们正确的答案。

或者,在 Perl 中,您可以这样做:

s{([0-9.]+)%}{$1/100}eg

这将使 Perl 计算除以 10 并将其传递给数学解析器

于 2009-04-19T07:09:16.997 回答
1

在 '%' 符号前查找数字的正则表达式是/(\d+)%/.

但是,数学表达式不是正则语言,因此正则表达式可能不是正确的工具。相反,您应该告诉解析器将 '%' 解释为“取之前的任何内容并将其除以 100”。“在此之前的任何内容”都可以是任何数学表达式,并且您不会遇到运算符优先级问题。您可以在语法树解析器中对它们进行排序。

Mixing text substitution with real language features often violates the principle of least astonishment. When a user sees that '%' divides whatever comes before by 100, he might try to use expressions like (23+42)%, but that will just produce a syntax error. Also, you need a more elaborate regex if you have something like 1.34e-14%, but these things would just sort themselves out when you use the tree parser.

于 2009-04-19T14:10:42.163 回答