什么是正则表达式来检索字符串中%符号前面的数字?

时间:2009-04-19 07:05:20

标签: regex parsing string-formatting

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

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

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

由于

2 个答案:

答案 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%这样的东西,你需要一个更精细的正则表达式,但是这些东西只会在你使用树解析器时自行解决。