3

URL からハッシュの最初の部分 (# と /、?、または文字列の末尾の間の部分) を取得しようとしています。

これまでのところ、私はこれを出しました:

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 = /#(.*)[\?|\/|$]/

$ が[](文字クラスに表示される場合、入力/行の終わりではなく、文字通りの "$" 文字です。実際、あなたの部分は、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

$文字クラスでは文字列終了マーカーを使用できません。次のように、/またはでない文字のみを一致させる方がよいでしょう。?

/#([^\?\/]*)/
于 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 に答える