我有以下网址路由,我想确保路由的一部分只接受数字。因此,我可以提供一些检查单词的正则表达式。
/页/ {当前页}
所以...有人可以给我一个正则表达式,当该单词是一个大于0的数字(任何整数)时(即1< - > int.max)匹配。
答案 0 :(得分:25)
/^[1-9][0-9]*$/
其他答案的问题:
/([1-9][0-9]*)/ // Will match -1 and foo1bar
#[1-9]+# // Will not match 10, same problems as the first
[1-9] // Will only match one digit, same problems as first
答案 1 :(得分:5)
如果您希望它大于0,请使用此正则表达式:
/([1-9][0-9]*)/
只要数字没有前导零(如'03'),这个就可以工作。
但是,我建议您只使用简单的[0-9]+
正则表达式,并验证实际网站代码中的数字。
答案 2 :(得分:1)
这个会解决您的具体问题。这个表达
/\/page\/(0*[1-9][0-9]*)/ or "Perl-compatible" /\/page\/(0*[1-9]\d*)/
应该捕获任何非零数字,甚至是0填充。而且因为它甚至不会看符号,所以斜杠后的-
将不适合该模式。
我对眼睑无法表达的问题是,您可能尚未将该数字隔离,以便^
和$
起作用。你将不得不做一些工作来隔离它。但是一般的解决方案不是假设数字是字符串包含的全部,如下所示。
/(^|[^0-9-])(0*[1-9][0-9]*)([^0-9]|$)/
如果RE语言具有那些,则可以用两个尾端组替换字边界标记(\b
)。如果没有,你会把它们放到非捕获组中,如果语言有它们,或者甚至看起来有它们 - 但它更可能在看起来之前有字边界。
完整 Perl兼容版本:
/(?<![\d-])(0*[1-9]\d*)\b/
我选择了一个负面的lookbehind而不是一个单词边界,因为' - '不是一个单词字符,所以-1在' - '和'1'之间会有一个“单词边界”。负面的lookbehind将匹配字符串的开头 - 前面不能有数字字符或' - '。
您可以说零宽度假设^
只是满足零宽度假设(?<![\d-])
的情况之一。
答案 3 :(得分:0)
string testString = @"/page/100";
string pageNumber = Regex.Match(testString, "/page/([1-9][0-9]*)").Groups[1].Value;
如果不匹配,pageNumber将为“”
答案 4 :(得分:0)
虽然Jeremy的正则表达式并不完美(应该在上下文中测试,反对主角等),但他的建议是好的:去寻找一个通用的,简单的正则表达式(例如,如果你必须在Apache的mod_rewrite中使用它),那么任何方法,处理服务器代码中的最终重定向(如果可以的话),并在那里真正检查参数的有效性。
否则,我会用界限改善杰里米的表达:/\b([1-9][0-9]*)$/
当然,正则表达式无法对任何 max int进行检查,最多可以控制位数:例如/\b([1-9][0-9]{0,2})$/
。
答案 5 :(得分:0)
这将匹配任何字符串,如果它包含/page/
,则必须后跟一个数字,而不是仅零。
^(?!.*?/page/([0-9]*[^0-9/]|0*/))
(?! )
是一个负面的预测。它将匹配一个空字符串,只有当它包含的模式 not 匹配当前位置时才会匹配。