我正在使用一个使用 % 作为 mod 符号的数学解析器。我想将它用于百分号,以允许用户输入“25%*10”或“25% of 10”并收到答案“2.5”(他们可以输入任何内容)。
然后我会使用要求的正则表达式来获取“25%”(可以在字符串的任何部分)并进行简单的计算(25 / 100),然后将字符串中的 25% 替换为计算值传递给数学解析器。基本上,在将完整字符串传递给数学解析器之前,我正在对百分比符号前面的数字进行一些预计算。
我一直在与正则表达式作斗争,并希望有人能帮助我。
谢谢
我正在使用一个使用 % 作为 mod 符号的数学解析器。我想将它用于百分号,以允许用户输入“25%*10”或“25% of 10”并收到答案“2.5”(他们可以输入任何内容)。
然后我会使用要求的正则表达式来获取“25%”(可以在字符串的任何部分)并进行简单的计算(25 / 100),然后将字符串中的 25% 替换为计算值传递给数学解析器。基本上,在将完整字符串传递给数学解析器之前,我正在对百分比符号前面的数字进行一些预计算。
我一直在与正则表达式作斗争,并希望有人能帮助我。
谢谢
最简单的方法是让数学解析器进行除法:
s/([0-9.]+)%/($1\/100)/g
这只是用“(25/100)”替换“25%”......所以如果用户输入“ 25%*10
”他们现在将拥有“ (25/100)*10
”,当评估时会给他们正确的答案。
或者,在 Perl 中,您可以这样做:
s{([0-9.]+)%}{$1/100}eg
这将使 Perl 计算除以 10 并将其传递给数学解析器
在 '%' 符号前查找数字的正则表达式是/(\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.