我有这个注册表
var id = url.match(/(\d+)\/\d+$/)[1];
正在解析网址
http://whatever.com/something/70/48/359
它抓住48应该但它失败了
http://whatever.com/something/70/48/359#
为什么#搞乱了正则表达式
答案 0 :(得分:5)
请尝试使用此正则表达式:
/(\d+)\/\d+(?:$|[?#])/
这不仅匹配字符串的结尾,还匹配查询(?
)和片段(#
)的分隔符。
如果您的url
恰好是文档的位置(例如location.href
),请更好地使用location.pathname
。
答案 1 :(得分:5)
由于...... \d+$
表示“在最后一个数字之后,网址必须立即跟随”(没有#inbetween)。
答案 2 :(得分:2)
#
不是数字。尝试:
(\d+)\/\d+#?$
答案 3 :(得分:2)
最后的$
将正则表达式锚定到URL的末尾,这意味着只有当两个数字在末尾时才会匹配。您可以在结尾添加(#.*)?
以允许选择#anchor
:
// Allow optional anchor.
var id = url.match(/(\d+)\/\d+(#.*)?$/)[1];
您可能还希望允许查询字符串,即问号后面的部分。为此添加(\?.*?)?
:
// Allow optional query string and anchor.
var id = url.match(/(\d+)\/\d+(\?.*?)?(#.*)?$/)[1];
答案 4 :(得分:2)
因为期望字符串以数字结尾,因为\d+$
中有美元符号。
这是您的正则表达式修复为忽略#anchors
和?query=strings
:
var id = url.match(/(\d+)\/\d+(|#.*|\?.*)$/)[1];
(|#.*|\?.*)
部分将不匹配,#anything或?any。
或更有效率:
var id = url.match(/(\d+)\/\d+([#\?].*)?$/)[1];
答案 5 :(得分:1)
因为\d+
和$
表示该行必须以一位或多位数结尾。由于第二个示例以#
结尾,因此在这种情况下不匹配。
答案 6 :(得分:1)
$将你的正则表达式锚定到字符串的末尾。由于#不是数字,因此正则表达式与第二个示例不匹配。
答案 7 :(得分:1)
\d+$
部分表示“一个或多个数字,后跟字符串结尾”。如果介于#
之间,则不再匹配。
如果你想做的就是允许最后的#
标志,请尝试:
/(\d+)\/\d+\#?$/
答案 8 :(得分:1)
这不是对正则表达式的完全修复,但您可以通过将<a href="#">
的链接更改为<a href="#" onclick="return false;">
使用像这样的jQuery可能更容易做到这一点...
$(function() {
$("a[href=\\#]").click(function(e) {
e.preventDefault();
});
});
答案 9 :(得分:1)
var id = url.match(/(\d+)\/\d+#?$/)[1];
将修复你
答案 10 :(得分:0)
.match(/(\d+)\/\d+[^\/]*$/)[1]