2011-02-24 35 views
0

我试图匹配以下内容,并且我正在很难做到这一点。使用正则表达式匹配0到100或0%到100%

我想允许0到100或0%到100%。在我的文本框中,我去掉了%,所以如果它们放入100中,它不会在正则表达式中失效并跳过该条。

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

目前,我有以下

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

但是,让101而不是101%

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

+0

**有些人,当面对一个问题,认为“我知道,我会用正则表达式。”现在他们有两个问题.. ** - [杰米Zawinski](http://www.jwz.org/)1997 – 2011-02-24 22:23:52

回答

14

你正在尝试使用正则表达式来做一些正则表达式并不打算做的事情。你有JavaScript和Python标签;你应该使用正则表达式来确保输入是一个数字,然后使用javascript或python来确定数字是太大还是太小。这样会容易得多。

+0

另见http:// stackoverflow.com/questions/4098086/to-use-or-not-to-use-regular-expressions/40 98123#4098123。 – delnan 2011-02-24 21:20:15

+0

是的,不要使用正则表达式作为所有工具的一个工具,即使它可以完全不可读,即使它非常简单并且可能包含一些奇怪的边角情况。 – Voo 2011-02-24 22:16:21

0

在@ eykanal的答案的精神,这里有一个正则表达式:

(\d{1,3})%?作品我用Python this

我的测试文本是:

101 
100 
100% 
101% 
0% 
0 
50% 

,将让你只需数,然后你就可以分析和判断它是否是你可以接受的范围。

+0

这只是匹配0或100,不是吗? – BoltClock 2011-02-24 21:18:17

+0

@BoltClock:是的,我误解了这个问题。固定。 – nmichaels 2011-02-24 21:21:31

+1

这将接受999以及... – Martijn 2011-02-24 21:22:24

1

JavaScript的 “parseInt函数” 使用

parseInt函数并执行以下操作:

"100" -> 100 
"10k" -> 10 
"100%" -> 100 
在此之后

,请检查您的数字小于101

例如...

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

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

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

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

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

9

有些人,当与 面临的问题,认为“我知道,我将使用 正则表达式。“现在他们有 两个问题.. - Jamie Zawinski 1997年

在所有的严重性,你正在尝试做一些事情,正则表达式不打算这样做,这是执行的逻辑。你问的是,这个字符串是否包含一个数字,这是否正确,如果是,它是否为>= 0 && <= 100其中不是正则表达式可以或应该做的事情。

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

它是最佳解决方案吗?意图明显从只看表达式?我会认为没有,不是没有一些评论描述的意图。

的JavaScript

我想一个更好的更易于维护的解决方案是使用parseInt()功能,然后将结果明确地比较>= 0<= 100Explicit is Better than Implicit并且更自我记录。

的Python

你仍然将不得不诉诸正则表达式来验证格式,而只提取数字和转换,使用int(),对有效范围的测试将是多余的,但也更明确 。在这种情况下使用正则表达式可能不是一个很糟糕的选项,只要您评论使用正则表达式的意图即可。

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

+0

另外,永远不要忘记:http://xkcd.com/208/ – Martijn 2011-02-24 22:37:44

1

问题是标签 “蟒蛇”,所以我会在Python回答:

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

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

0

首先,我同意eykanal和贾罗德·罗伯逊

不过,这是一个正则表达式如此简单,我并不赞同,并认为它是更好的解决方案根据我:

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

我认为在第一个位置\d\d?提供检测数字< 100,第二个位置100单独,是更自然的逻辑。

而且\d\d?短,比\d{1,2}

编辑

更好更快地理解为:

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

但这些RE都进行检测。既然目的是为了验证,这一个就够了:

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

匹配0到100

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

匹配0%到100%

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