3

我正在尝试从 url 获取哈希的第一部分(# 和 /、a 之间的部分?或字符串的结尾

到目前为止,我提出了这个:

r = /#(.*)[\?|\/|$]/

// OK
r.exec('http://localhost/item.html#hash/sub')
["#hash/", "hash"]

// OK
r.exec('http://localhost/item.html#hash?sub')
["#hash?", "hash"]

// WAT?
r.exec('http://localhost/item.html#hash')
null

我希望收到“哈希”

我追查到问题

/#(.*)[$]/
r2.exec('http://localhost/item.html#hash')
null

知道有什么问题吗?

4

6 回答 6

3
r = /#(.*)[\?|\/|$]/

当 $ 出现在[]( 字符类中时,它是文字“$”字符,而不是输入/行的结尾。实际上,您的[\?|\/|$]部分相当于 just [?/$|],它匹配4个特定字符(包括管道)。

改用这个(JSFiddle

r = /#(.+?)(\?|\/|$)/
于 2012-11-13T22:36:49.550 回答
3

你不应该写[$](在字符类中),除非你想匹配$字面而不是行尾。

/#(.*)$/

代码

var regex = /\#(.*)$/;
regex.exec('http://localhost/item.html#hash');

输出

["#hash", "hash"]

Your regex: /#(.*)[\?|\/|$]/
  //<problem>-----^       ^-----<problem>

           | operator won't work within [], but within ()
           $ will be treated literally within  []
           .* will match as much as possible. .*? will be non-greedy

进行上述更改后,您最终会得到/#(.*?)(\?|\/|$)/

于 2012-11-13T22:37:01.463 回答
1

我使用http://regexpal.com/来测试我的正则表达式。您的问题是您的正则表达式需要一个/. 所以它不适用,http://localhost/item.html#hash但它适用于http://localhost/item.html#hash/

试试这个:

r = /#([^\?|\/|$]*)/
于 2012-11-13T22:38:15.810 回答
1

为什么是正则表达式?这样做(几乎没有正则表达式)

var a = document.createElement('a');
a.href = 'http://localhost/item.html#hash/foo?bar';
console.log(a.hash.split(/[\/\?]/)[0]); // #hash

只是为了方便,如果node.js您正在使用:

var hash = require('url').parse('http://localhost/item.html#hash').hash;
于 2012-11-13T22:39:07.077 回答
1

您不能$在字符类中使用字符串结束标记。您最好只匹配不是/or的字符?,如下所示:

/#([^\?\/]*)/
于 2012-11-13T22:50:09.917 回答
0

我发现这个似乎有效的正则表达式

r = /#([^\/\?]*)/

r.exec('http://localhost/item.html#hash/sub')
["#hash", "hash"]

r.exec('http://localhost/item.html#hash?sub')
["#hash", "hash"]

r.exec('http://localhost/item.html#hash')
["#hash", "hash"]

无论如何,我仍然不明白为什么原来的不起作用

于 2012-11-13T22:48:51.190 回答