从两种不同的 url 格式中提取数字的单个正则表达式?

Posted

技术标签:

【中文标题】从两种不同的 url 格式中提取数字的单个正则表达式?【英文标题】:Single regular expression that extracts a number from two different url formats? 【发布时间】:2013-01-22 03:08:53 【问题描述】:

我正在尝试创建一个正则表达式,可用于从 php 函数中的两个不同 url 中提取数字。这些网址的格式是:

/t/2121/title/

/top2121.html

我不擅长正则表达式,并且已经尝试过以下及其许多变体:

#^/t/(\d+?)/|/top(\d+?)\.html/#i

这并没有做任何事情,在阅读了许多有关正则表达式的网站和教程后,我仍然完全不知所措。有没有我可以创建的正则表达式允许我添加数字而不管输入的 url 格式是什么?

【问题讨论】:

看起来这是你的答案:***.com/questions/6604455/… [^\d]*(\d*).* 不会成功吗? 我很抱歉。我错误地输入了第二种 url 格式。我编辑了问题以包含我正在使用的正确格式。 我建议您不要将其作为一个正则表达式来执行,除非您有非常具体的理由必须这样做。为清楚起见,将这两个任务分开。 【参考方案1】:

正则表达式仅提取数字,同时检查 url 是否与可接受的格式匹配:

#^\/t(?:\/(\d+)\/[a-z_-]+\/?|op(\d+)\.html)$#i 编辑:2组捕获

在此处解释演示:http://regex101.com/r/dO5dI4

变体 #2: 在同一组中捕获

#^\/t(?|\/(\d+)\/[a-z_-]+\/?$|op(\d+)\.html$)#i

在此处解释演示:http://regex101.com/r/cG9vC3

【讨论】:

谢谢。 /blabla21051.html 不应该工作。根据问题,它不是有效的 url 结构。还有我们将数字限制为 4 或 5 的原因吗?我宁愿根本不限制它们。这个论坛已经有超过 10 万个主题。 太棒了,这正是我所需要的!也感谢网站。学习和测试正则表达式的好地方! 我刚刚意识到上面的正则表达式将在不同的索引中完成匹配。这将是 /t/1231/asdas/ 中的第一个匹配项和 /top1231.html 中的第二个匹配项。有没有办法对其进行返工,使其成为相同的索引,而不管匹配的模式如何?【参考方案2】:

如果您只想要t 之后的第一个数字而不管/ 之间的关系,这样的事情可能会起作用:#t/?(\d+)#i

编辑:

示例:http://codepad.viper-7.com/0z3ee0

【讨论】:

我写这个问题的时候搞砸了。第二个 url 格式为 /top2121.html 好吧,如果你想要的只是数字,而这些是 uri 中唯一的数字,那么只需正则表达式 /\d+/ 因为这可以是用户提交的,所以我想匹配数字,但也要确保提交的 url 是有效的。【参考方案3】:

我能够让这个正则表达式匹配两种类型的 url 格式:

#^/(?:(?:t/)|(?:top))(\d+)(?:(?:\.html)|(?:/))#i

如果有人有更有效的方式来执行相同的正则表达式,我很想听听。

【讨论】:

【参考方案4】:

如果您有其中任何一个 URL,则可以使用此表达式。您的号码应该存储在您的第二个位置:

#^/t(op|/)(\d+)(\.html|/.*)#i

【讨论】:

【参考方案5】:

网址中是否会有您不关心的数字?如果没有,您可以通过捕获数字并忽略其余部分来保持简单:

#(\d+)#

【讨论】:

以上是关于从两种不同的 url 格式中提取数字的单个正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

在js中用正则表达式判断url的格式

Javascript Regex 从两个不同格式的文本块中获取特定字符串

正则表达式实例

python正则表达式提取字符串

用python正则表达式提取字符串

python利用正则表达式提取字符串