用于匹配URL扩展名的正则表达式模式

时间:2017-11-27 17:17:56

标签: javascript regex

我有以下示例网址:

1) example.com/foo.js
2) example.com/foo.js?
3) example.com/foo.js?bar

4) example.com/foo.jsbar
5) example.com/foo.js/bar

我希望regex js与1,2,3匹配,并且与4,5不匹配。扩展名。

我在LiveHTTP headers add-on firefox中使用此模式。

首先我写这个:

.js$

这只是指向1。

而且:

.js\?

指向2,3。

而且:

.js\??$

指向1,2。

所以最后我写了这个:

.js$|.js\?

这很有效。

在线测试:https://regex101.com/r/BU5IqH/2

现在我的问题是如何在模式中使用.js字符串时使用正则表达式?

2 个答案:

答案 0 :(得分:2)

我的答案比@Wiktor's answer慢,但更具可读性。话虽如此:

  • 如果可读性是您的主要关注点,请使用我的答案。
  • 如果主要关注效果,请使用@Wiktor's answer

代码

See regex in use here

\.js(?:\?|$)

在您的问题下面的评论中,您说我可以删除?:,因此在这种情况下,正则表达式将为\.js(\?|$)

用法

var a = [ 'example.com/foo.js', 'example.com/foo.js?', 'example.com/foo.js?bar', 'example.com/foo.jsbar', 'example.com/foo.js/bar', 'asasa.com/asasas.css', 'asasa.com/asasas.gif'];
var r = /\.js(?:\?|$)/;
a.forEach(function(s) {
  console.log(s + ': ' + r.test(s));
});

说明

  • \.js按字面意思匹配.js
  • (?:\?|$)匹配以下任一项
    • \?字面上匹配问号字符?
    • $断言行尾的位置

答案 1 :(得分:1)

您希望匹配.js后面的?或字符串结尾。

使用

/\.js(?![^?])/

<强>详情

  • \. - 一个点
  • js - js子字符串
  • (?![^?]) - 除?以外的其他字符后面没有#(因此,如果有?或字符串结尾,则只能匹配)当前位置。

参见JS演示:

var strs = [ 'example.com/foo.js', 'example.com/foo.js?', 'example.com/foo.js?bar', 'example.com/foo.jsbar', 'example.com/foo.js/bar'];
var rx = /\.js(?![^?])/;
for (var s of strs) {
  console.log(s, "=>", rx.test(s));
}