我相信最好的模式是:
/^[^\#\?]+\/media-group\/([^\?]+).*$/
爆发为:
^ - start of string
[^\#\?]+ - one or more non-hash, non-question-marks
\/ - literal char
media-group - literal chars
\/ - literal char
( - start capture group
[^\?]+ - one or more chars non-question-marks
) - end of capture group
.* - zero or more chars
$ - end of string
这样做的原因是因为 [^\?]+ 是“贪婪的”,因为它将尝试最长可能的匹配,其中包含一个问号后跟任意字符,或者什么都不包含,因为字符串末尾的所有字符已经在非问号捕获组中捕获。
所以,使用
var RE=new RegExp(/^[^\#\?]+\/media-group\/([^\?]+).*$/),
url="image/media-group/rugby-league-programme-covers-3436?sort=title";
console.log(url.match(RE)[1])
prints:rugby-league-programme-covers-3436
并将 url 更改为image/media-group/rugby-league-programme-covers-3436
,会产生相同的结果。
更新
修改了 David Foerster 的评论模式。