我正在使用asp.net RegularExpressionValidator
来检查多行文本框上的输入。我几乎拥有它,但我必须遗漏一些东西。这就是它应该是:
1 => valid
1-10 => valid
1-10,45,50 => valid
1 10 45 50 => valid
111 => INVALID
但是,111
将返回有效
以下是我正在使用的正则表达式:"(([0-9]{1,2})(,|\s|-)?)*"
它适用于除111
之外的所有内容,它表示有效。我知道它为什么认为它有效,我只是不知道如何使它无效。
答案 0 :(得分:3)
不要让分隔符可选,那么你将匹配number-nothing-number,因此匹配111,而是做类似的事情:
"[0-9]{1,2}([-,\s][0-9]{1,2})*"
为清晰起见, 编辑:如果您的正则表达式引擎与整个字符串不匹配,则需要在开头添加^
,并在结束时添加$
正则表达式。
答案 1 :(得分:0)
您写的正则表达式匹配“111”中的“11”和重复模式的零次匹配。如果你将正则表达式包装在^ ... $中它应该可以工作:
^(([0-9]{1,2})(,[\s-])?)*$
从那时起,正则表达式将不允许字符串中的任何其他字符。
答案 2 :(得分:0)
在[0-9]{1,2}
学期之后,您需要一个负向前瞻以确保下一个字符也不是数字。我不熟悉asp.net,但像[0-9]{1,2}(?![0-9])
这样的东西可能会产生更好的结果。有关前瞻的更多信息,请参阅this page。
修改:上面发布的正则表达式有帮助,但仍匹配111
的后两位数字。以下正则表达式应该有效(使用online regex tester验证)。它在开头添加了一个单词边界锚点,这可以防止表达式在数字中间开始匹配。它还使分隔符成为必需而非可选。这种组合消除了对前瞻的需求。
(\b([0-9]{1,2})(-|,|\s|$))+
答案 3 :(得分:0)
使用^
左键锚定您的模式。 *
贪婪,您在1
中的第二个和第三个111
上匹配。
答案 4 :(得分:0)
也许是为了让事情变得更简单,将其分解为多个正则表达式检查?
如果字符串与(([0-9]{1,2})(,|\s|-)?)*
匹配,则检查字符串是否与\d{3,}
匹配。如果是,那么失败否则通过。
答案 5 :(得分:0)
我认为你需要要求分隔符。 '?'允许零个或一个实例。
答案 6 :(得分:0)
我认为有两个问题。一个问题是正则表达式验证用户输入的每个字符。之后提取数据的另一个正则表达式。
要使用对每个输入字符进行验证的正则表达式,结束锚点比开头更重要,尽管起始锚点,不需要的字符可以进入。
所以在rubular.com上,这个特殊的正则表达式允许使用规则的[, - ]字符
最后,数据提取会有所不同,所以这只适用于每个字符输入的用户。
对于我尝试的各种变体,它都有效。
^(?:\b\d{1,2}(?:([, -])(?!\1)[, -]?|))+$
确实需要\b
来区分连续3位数
尝试一下。