这个正则表达式有什么问题

时间:2010-11-19 18:25:16

标签: javascript regex

我有这个注册表

var id = url.match(/(\d+)\/\d+$/)[1]; 

正在解析网址

http://whatever.com/something/70/48/359

它抓住48应该但它失败了

http://whatever.com/something/70/48/359#

为什么#搞乱了正则表达式

11 个答案:

答案 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]