正则表达式,用于在字符后面找到单词,在另一个字符之前找到它

时间:2013-07-16 23:25:31

标签: javascript regex

我有一个网址:

  

图像/媒体组/橄榄球联盟节目盖-3436?排序=标题

  

图像/媒体组/橄榄球联盟节目盖-3436

我需要在媒体组之后获取所有内容,不包括?或之后的任何内容。

因此在两个实例中rugby-league-programme-covers-3436都是我需要返回的

我使用了正则表达式/media-group/(.*)\?,它适用于存在查询字符串但不存在查询字符串的实例。

我正在使用以下代码

var patt=new RegExp('/media-group/(.*)\?');
return patt.exec(url)[1];

非常感谢您对此的帮助

1 个答案:

答案 0 :(得分:5)

我相信最好的模式是:

/^[^\#\?]+\/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])

打印:rugby-league-programme-covers-3436并将网址更改为image/media-group/rugby-league-programme-covers-3436,会产生相同的结果。

更新

修改了大卫福斯特的评论模式。