需要一个简单的RegEx才能在一个单词中找到一个数字

时间:2008-10-31 04:55:18

标签: regex

我有以下网址路由,我想确保路由的一部分只接受数字。因此,我可以提供一些检查单词的正则表达式。

/页/ {当前页}

所以...有人可以给我一个正则表达式,当该单词是一个大于0的数字(任何整数)时(即1< - > int.max)匹配。

6 个答案:

答案 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 匹配当前位置时才会匹配。