我有以下示例网址:
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
字符串时使用正则表达式?
答案 0 :(得分:2)
我的答案比@Wiktor's answer慢,但更具可读性。话虽如此:
\.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));
}