我正在尝试编写正则表达式以匹配这些网址中的数字(12345678
和1234567890
)。
http://www.example.com/p/12345678
http://www.example.com/p/12345678?foo=bar
http://www.example.com/p/some-text-123/1234567890?foo=bar
规则:
/p/
我的尝试:
\/p\/([0-9]+)
匹配第一个和第二个,但不匹配第三个。所以我试过了:
\/p\/[^\/?]*\/?([0-9]+)
没有快乐。
答案 0 :(得分:2)
正则表达式可能不适合这项工作。看起来在每种情况下,使用URL解析器拆分URL会更有意义。从您的示例中可以看出,数字部分始终是URL路径部分中的最后一项。我不确定您使用的是哪种语言,但许多语言都提供了可以将URL解析为其组成部分的功能。
$path = parse_url($url, PHP_URL_PATH);
if(strpos($path, "/p/") === 0) {
$base = basename($path);
} else {
// error
}
每次都有效,假设$ url是你要解析的字符串。
答案 1 :(得分:1)
我扩展了您的版本,它现在适用于所有示例:
\/p\/(.+\/)*(\d+)(\?.+=.+(&.+=.+)*)?$
如果您不关心URL是否有效,可以将正则表达式缩小为:
\/p\/(.+\/)*(\d+)($|\?)
答案 2 :(得分:0)
如果我理解的话,你想要的数字只能是:
/p/123?foo=bar456
匹配123
和/p/foobar?foo=bar456
不匹配任何内容然后您可以使用以下正则表达式:
(?=/p/).*/\K\d+
<强>解释强>
(?=/p/) # lookahead: check '/p/' is in the URL
.*/ # go to the last '/' thanks to greediness
\K # leave everything we have so far out of the final match
\d+ # select the digits just after the last '/'
为了避免转发正斜杠,请不要将它们用作regex delimiters:#(?=/p/).*/\K\d+#
会很好。
请参阅demo here。
答案 3 :(得分:0)
\/p\/(?:.*\/)?(\d+)\b
你可以尝试这个。这将根据你的密码捕获整数。参见demo.Grab捕获或组。
https://regex101.com/r/dU7oN5/29
$re = "/\\/p\\/(?:.*\\/)?(\\d+)\\b/";
$str = "http://www.example.com/p/12345678\nhttp://www.example.com/p/12345678?foo=bar\nhttp://www.example.com/p/some-text-123/1234567890?foo=bar";
preg_match_all($re, $str, $matches);
答案 4 :(得分:-2)
var regex = new Regex(@"/(?<ticket>\d+)");
var subject = "http://www.example.com/p/some-text-123/1234567890?foo=bar";
var ticket = regex.Match(subject).Groups["ticket"].Value;
输出:1234567890