Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 需要一个简单的正则表达式在单个单词中查找数字_Regex - Fatal编程技术网

Regex 需要一个简单的正则表达式在单个单词中查找数字

Regex 需要一个简单的正则表达式在单个单词中查找数字,regex,Regex,我有下面的url路由,我想确保路由的一部分只接受数字。因此,我可以提供一些检查单词的正则表达式 /第/{currentPage} 所以。。有人能给我一个正则表达式,当单词是大于0(即1 int.max)的数字(任何int)时,该正则表达式与之匹配。如果您希望它大于0,请使用此正则表达式: /([1-9][0-9]*)/ 只要数字没有前导零(如'03'),这就行了 但是,我建议只使用一个简单的[0-9]+正则表达式,并验证实际站点代码中的数字 string testString = @"/pag

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

/第/{currentPage}


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

如果您希望它大于0,请使用此正则表达式:

/([1-9][0-9]*)/
只要数字没有前导零(如'03'),这就行了

但是,我建议只使用一个简单的
[0-9]+
正则表达式,并验证实际站点代码中的数字

string testString = @"/page/100";
string pageNumber = Regex.Match(testString, "/page/([1-9][0-9]*)").Groups[1].Value;
如果不匹配,则页码将为“”

其他答案的问题:

/([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

虽然Jeremy的正则表达式并不完美(应该在上下文中测试,针对前导字符等等),但他的建议很好:使用一个通用的简单正则表达式(例如,如果必须在Apache的mod_重写中使用它),但无论如何,要处理服务器代码中的最终重定向(如果可以的话),并在那里真正检查参数的有效性

否则,我将使用边界改进Jeremy的表达式:
/\b([1-9][0-9]*)$/


当然,正则表达式不能提供对任何max int的检查,充其量您可以控制位数:
/\b([1-9][0-9]{0,2})$/
例如。

这将匹配任何字符串,因此,如果它包含
/page/
,则必须后跟一个数字,而不仅仅是零


(?!)
是一种消极的前瞻。只有当包含的模式与当前位置不匹配时,它才会匹配空字符串。

这一个将解决您的特定问题。这句话

/\/page\/(0*[1-9][0-9]*)/ or "Perl-compatible" /\/page\/(0*[1-9]\d*)/
应捕获任何非零数字,即使是0填充的数字。因为它甚至不寻找符号,斜杠后面的
-
将不符合模式


“无眼睑”表达式的问题是,可能您尚未将数字隔离,以便
^
$
可以工作。你得做些工作来隔离它。但一般的解决方案不是假设数字是字符串包含的全部,如下所示

/(^|[^0-9-])(0*[1-9][0-9]*)([^0-9]|$)/
和两个尾端组,您可以用单词边界标记(
\b
)替换,如果RE语言有这些标记的话。如果失败的话,你会把它们放在非捕获组中,如果语言有它们的话,甚至放在lookarounds中,如果语言有它们的话——但是在lookarounds之前,它更可能有单词边界

完全兼容Perl的版本:

/(?<![\d-])(0*[1-9]\d*)\b/
/(?
我选择了负查找,而不是单词边界,因为“-”不是单词字符,所以-1在“-”和“1”之间有一个“单词边界”。负查找将匹配字符串的开头——前面不能有数字字符或“-”


您可以说零宽度假设
^
只是满足零宽度假设
(?。

我很高兴提供的数字可以大于int.max。我真的只是想检查字符串是否大于零,是否是一个数字。如果它大于int.max…meh。我不太担心。[0-9]+将实际匹配10,但也将匹配0,这是不需要的。干杯。但我不想检查单词“page”是否存在。我只需要确保我拥有的字符串是一个数字(使用正则表达式)。“可能您还没有隔离该数字”-除了Pure。Krome明确表示它可以作为变量'currentPage'使用。并且还说:“我也不需要检查单词'page'或'/'字符等。”正确无睑。我不知道为什么人们不能理解我说的话?:)这很简单(我的问题)当前位置如何检查单词是否是大于零的数字。就是这样。总之..问题已经回答:)
/(^|[^0-9-])(0*[1-9][0-9]*)([^0-9]|$)/
/(?<![\d-])(0*[1-9]\d*)\b/