0

ここで奇妙なもの (またはそうではないかもしれません)、Javascript 正規表現を介して 2 つのキャプチャ グループを取得しようとしています。最初のグループ: 1 つ以上の数字 (0-9)、2 つ目のグループ: 1 つ以上の単語文字またはハイフン (AZ、0-9 、 -) しかし、何らかの理由で後者のグループを取得できません。

注意:|どちらか一方を受け取る可能性があるため、意図的に代替 ( ) 文字を含めています)

これは私が使用しているコードです:

var subject = '#/34/test-data'
var myregexp = /#\/(\d+)|\/([\w-]+)/;
var match = myregexp.exec(subject);
if (match != null && match.length > 1) {
  console.log(match[1]); // returns '34' successfully
  console.log(match[2]); // undefined? should return 'test-data'
}

おもしろいことに、Regex Buddy は、2 つのキャプチャ グループがあることを教えてくれ、実際にはテスト フレーズでそれらを正しく強調表示します。

これは私の JavaScript 構文の問題ですか?

4

2 に答える 2

1

「|」を外すと 必要な結果が得られます...これは役に立ちますか?

var subject = '#/34/test-data'
var myregexp = /#\/(\d+)\/([\w-]+)/;
var match = myregexp.exec(subject);
if (match != null && match.length > 1) {
  console.log(match[1]); // returns '34' successfully
  console.log(match[2]); // undefined? should return 'test-data'
}

ハッピーコーディング!

編集

あなたの問題は、「|」を使用していたため、JSに最初のグループまたは2番目のグループのいずれかをキャッチするように指示していたことであり、JS evalは遅延しているため、最初のグループが見つかったときにそこで停止した.. . RegExp から OR オペランドを削除すると、両方の結果が得られます... (AND のようなもの)。

于 2011-10-11T01:43:19.003 に答える
1

変更する場合:

var myregexp = /#\/(\d+)|\/([\w-]+)/;

|代替メタキャラクターを削除して、次のようにします。

var myregexp = /#\/(\d+)\/([\w-]+)/;

その後、両方のグループに一致します。現在、正規表現は最初のグループに一致すると停止し、2 番目のグループは空になります\d+[\w-]+を削除する|と、その後に\d+続く/が検索される[\w-]+ため、常に両方に一致するか、まったく一致しません。

編集: #/34/test-data#/test-dataまたはのすべてに一致させるには、代わりに#/34使用できます#(?:\/(\d+))?\/([\w-]+)

于 2011-10-11T01:44:01.013 に答える