我正在尝试匹配以下内容,而且我很难这样做。
我想允许0到100,或0%到100%。在我的文本字段中,我删除%out,所以如果它们输入100,它将不会在正则表达式中失败并跳过条带。
因此,我需要一个正则表达式允许0到100或0%到100%。 101或101%无效。
目前,我有以下
(?:^((\\%)?100(\\%)?$)|(?:^(\\%)?[0-9]{1,2}(\\%)?)((\\.|,)?[0-9]+)?$)
但这允许101而不是101%
请帮忙!任何帮助将不胜感激。
答案 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()
进行转换,针对有效范围的测试将是多余的,但也会更多显式。在这种情况下,使用正则表达式可能不是一个糟糕的选择,只要您评论使用正则表达式的意图。
答案 2 :(得分:3)
/^(100|[0-9]{1,2})%?$/
在此测试: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][%]$