0

文字列「QQxaxbxcQQ」があり、x の後に任意の文字が続くすべてのグループをキャプチャしたいとします。また、QQ 間のみを検索したい (文字列には他のものが含まれる場合があります)。私はこれがうまくいくと思いました:

var matches = str.match(/QQ(x\w)+QQ/)

ただし、これは最後の一致 (xc) のみを返すようです。正しい方向に私を向けることができますか?

編集:私の質問の最初のバージョンは単純化されすぎていました。元のレスポンダーに謝罪します。実際の問題に近づけるために編集しました。

4

5 に答える 5

1

g正規表現の最後にパラメータを追加するだけです。gフラグは、すべての一致、この場合は後方参照のすべての一致を含む配列を返します(x\w)

ここで太字で示しています:/ QQ(x \ w)+ QQ / g

var matches = str.match(/QQ(x\w)+QQ/g)

一致は配列です

これを見てください:http://jsfiddle.net/SZRSA/3/

于 2012-11-30T18:06:13.033 に答える
1

+ 演算子は貪欲です。/(x\w)+/文字列全体と一致する必要が'xaxbxc'あり、キャプチャ グループには、(x\w)コンポーネントと一致する最終的な値が含まれます。この場合'xc'。連続する各一致をキャプチャする場合は、/(x\w)+/代わりに/((?:x\w)+)/. これにより、キャプチャ グループがシーケンス内ではなく、シーケンス内で移動します。は(?: )非キャプチャ グループを表します。

編集:

連続するインスタンスだけでなく、のすべてのインスタンスが必要な場合は(x\w)、 + 演算子またはキャプチャ グループを使用しないでください。グローバル正規表現を使用するだけです: /x\w/g.

'QQxaxbQQxcQQ'.match(/x\w/g)利回り['xa, 'xb', 'xc']

'QQxaxbQQxcQQ'.match(/((?:x\w)+)/)利回り['xaxb', 'xaxb']

編集2:

QQs の間だけを検索する場合は、asplitが最速の方法です。(ここではアンダースコアが大いに役立ちます。)

_.chain('xyQQxaxbQQxcQQxr'.split('QQ'))
.slice(1, -1)
.map(function (string) {
    return string.match(/x\w/g);
})
.flatten()
.compact()
.value()

得られる ['xa', 'xb', 'xc']

于 2012-11-30T18:05:37.370 に答える
0

おそらく、繰り返しをキャプチャグループでラップすることが必要です(x\w連結されたすべてのインスタンスを一緒にキャプチャします)。

var matches = str.match(/QQ((x\w)+)QQ/)

これは次のように返さ"xaxbxc"れますmatches[1]

于 2012-11-30T18:03:44.573 に答える
0

すべてのグループをキャプチャする場合は、次を使用します。

var matches = str.match(/(x\w)/g)

出力:

["xa", "xb", "xc"]

私は2つの変更を加えました:

  • +各 x の後に 1 つの文字が続くように、を削除しました
  • gすべてのグループを要求する修飾子を追加しました

参照


編集 : QQ と QQ の間にある場合にのみ一致を取得したい場合は、次のようにすることができます。

var matches = str.split('QQ').filter(function(v,i){return i%2})
    .join(' ').match(/(x\w)/g)
于 2012-11-30T17:59:59.707 に答える
0
'xaxbxc'.match(/x\w/g);

返す

["xa", "xb", "xc"]

OPが質問を変更したため。現在は、JavaScript の正規表現とサブマッチの重複です。

于 2012-11-30T18:01:53.850 に答える