使用正则表达式匹配0到100或0%到100%

时间:2011-02-24 21:13:03

标签: javascript python regex

我正在尝试匹配以下内容,而且我很难这样做。

我想允许0到100,或0%到100%。在我的文本字段中,我删除%out,所以如果它们输入100,它将不会在正则表达式中失败并跳过条带。

因此,我需要一个正则表达式允许0到100或0%到100%。 101或101%无效。

目前,我有以下

(?:^((\\%)?100(\\%)?$)|(?:^(\\%)?[0-9]{1,2}(\\%)?)((\\.|,)?[0-9]+)?$)

但这允许101而不是101%

请帮忙!任何帮助将不胜感激。

8 个答案:

答案 0 :(得分:14)

您正在尝试使用正则表达式来执行正则表达式无意做的事情。你有javascript和python标签;你应该使用正则表达式来确保输入是一个数字,然后使用javascript或python来确定数字是太大还是太小。这样会更容易。

答案 1 :(得分:9)

  有些人在面对的时候   问题,想想“我知道,我会用   正则表达式。“现在他们有了   两个问题.. - Jamie Zawinski   1997年

严肃地说,您正在尝试执行正则表达式不打算执行的操作,这是执行逻辑。你问的是,这个字符串是否包含一个数字,这很好,如果确实如此,是>= 0 && <= 100 不是正则表达式可以或应该做的事情

虽然表达式^(\d{1,2}|100)%?$可以告诉您输入是否与模式匹配,然后让您使用组拉出数字。结果属于>=0 && <= 100范围的事实是副作用。这种明显的范围检查行为不适用于任何其他任意数字范围。对于可维护的代码,应避免副作用。

这是最佳解决方案吗?仅仅通过查看表达式,意图显而易见?我会争辩,不是没有一些描述意图的评论。

<强>的JavaScript

我认为更易于维护的解决方案是使用parseInt()函数,然后将结果明确地与>= 0<= 100进行比较。 Explicit is Better than Implicit并且更自我记录。

<强>的Python

您仍然需要使用正则表达式来验证格式并仅提取数字并使用int()进行转换,针对有效范围的测试将是多余的,但也会更多显式。在这种情况下,使用正则表达式可能不是一个糟糕的选择,只要您评论使用正则表达式的意图。

Easier to escape: n-layered nested quotes or an iron maiden?

答案 2 :(得分:3)

/^(100|[0-9]{1,2})%?$/

  • “100”或任何由一位或两位数组成的数字
  • 可能后跟一个百分号。

在此测试:http://jsbin.com/azeya3

哦,是的,第一次捕获包含数字。

答案 3 :(得分:1)

使用javascript“parseInt”

parseInt执行以下操作:

"100" -> 100
"10k" -> 10
"100%" -> 100

之后,检查您的号码是否小于101。

...示例

function parsePerc(value) {
   return parseInt(value) < 101;
}

答案 4 :(得分:1)

问题标记为“python”,所以我将用Python回答:

def is0to100(num):
    try:
        return 0 <= int(num.rstrip('%')) <= 100
    except ValueError:
        return False

如果传入的值(减去可能的尾随'%')是0到100之间的有效整数,则返回True。我没有对它进行基准测试,但是我认为它比正则表达式快得多

答案 5 :(得分:0)

本着@ eykanal回答的精神,这是一个正则表达式:

(\d{1,3})%?使用this在Python中为我工作。

我的测试文字是:

101
100
100%
101%
0%
0
50%

这将为您提供数字,然后您可以解析并确定它是否在您可接受的范围内。

答案 6 :(得分:0)

首先,我同意eykanal和Jarrod Roberson

但是,使用正则表达式这么简单,我不同意,根据我的说法,这是更好的解决方案:

'(\d\d?|100)(?!\d)\Z'  and use of match()

我认为在第一个位置\d\d?出现以检测数字&lt; 100,在第二个位置,单独的数字100是更自然的逻辑。

同样\d\d?\d{1,2}

更短,更快速地被理解

修改

更好:

'(\d\d?|100)\D?\Z'

但这些RE用于检测。由于目的是验证,这个就足够了:

'(\d\d?|100)\Z'

答案 7 :(得分:0)

匹配0到100

^100$|^[123456789][0-9]$|^[0-9]$

匹配0%至100%

^100[%]$|^[123456789][0-9][%]$|^[0-9][%]$