使用正则表达式匹配0到100或0%到100%
我正在尝试匹配以下内容,但遇到了一些困难。
我想允许输入0到100,或者0%到100%。在我的文本框中,我会去掉百分号,所以如果用户输入100,正则表达式不会失败,也就不会跳过去掉百分号的步骤。
因此,我需要一个正则表达式,能够允许输入0到100或者0%到100%。输入101或101%都是不合法的。
目前,我有以下的代码
(?:^((\\%)?100(\\%)?$)|(?:^(\\%)?[0-9]{1,2}(\\%)?)((\\.|,)?[0-9]+)?$)
但是这段代码允许输入101,但不允许输入101%。
请帮帮我!任何帮助都将非常感激。
8 个回答
/^(100|[0-9]{1,2})%?$/
- 这个表达式可以匹配'100'或者任何一个由一位或两位数字组成的数字。
- 后面可能会跟一个百分号。
你可以在这里测试一下: http://jsbin.com/azeya3。
哦,对了,第一个捕获的内容是那个数字。
有些人在遇到问题时,会想:“我知道,我可以用正则表达式。” 结果他们就有了两个问题。 - Jamie Zawinski 1997年
说真的,你现在想做的事情其实不是正则表达式的目的,它们并不是用来处理逻辑的。你想知道的是,这串字符里是否包含一个数字,如果有的话,这个数字是否在 >= 0 && <= 100
的范围内,而这并不是正则表达式应该做的事情。
虽然这个表达式 ^(\d{1,2}|100)%?$ 可以告诉你输入是否符合某种模式,并且可以提取出数字。但结果是否在 >=0 && <= 100
的范围内只是一个副作用。这种看似范围检查的行为并不适用于其他任意的数字范围。为了代码的可维护性,应该避免副作用。
这是最优解吗? 从这个表达式中,意图是否明显?我认为不是,没有一些注释来说明意图的话,根本看不出来。
JavaScript
我觉得一个更好、更易维护的解决方案是使用 parseInt()
函数,然后明确地将结果与 >= 0
和 <= 100
进行比较。明确比隐含要好,而且更容易理解。
Python
你仍然需要用正则表达式来验证格式,只提取数字,然后用 int()
转换,测试有效范围会显得多余,但也会更明确。在这种情况下,使用正则表达式可能并不是坏选择,只要你注释清楚使用正则表达式的意图就可以了。
你正在尝试用正则表达式做一些正则表达式本来不适合的事情。你提到了javascript和python这两个标签;其实你应该先用正则表达式来检查输入的内容是否是数字,然后再用javascript或python来判断这个数字是否太大或太小。这样做会简单得多。