2

重複の可能性:
非キャプチャグループ?

私はJavaScriptで正規表現を学習していますが、(?:x)文字または「非キャプチャー括弧」は私には意味がありません。一致を覚えたくない場合は、かっこを完全に破棄しないのはなぜですか?/(?:x)/だけでなく使用する利点は何/x/ですか?

4

4 に答える 4

13

他の理由で括弧が必要になる場合があるためです。たとえば、の末尾の数字をキャプチャするとしますabababababab9。あなたが書いた場合ab*(\d)、それは一致しabbbbbbbbb9ます。オペレーターがすべてを繰り返すabように、括弧で囲む必要があります。。しかし、多分あなたは何回繰り返されたか気にしないでしょう。それはあなたが使うところです:。*(ab)*(\d)ab(?:)(?:ab)*(\d)

于 2012-07-10T14:08:15.757 に答える
3

キャプチャスロットを無駄にすることなくサブパターン全体に適用される、代替一致または数量詞で使用されるサブパターンを定義するために必要です。たとえば、と(?:)一緒に使用して|、正規表現をキャプチャせずに正規表現の途中で代替一致を提供できます。

于 2012-07-10T14:05:29.547 に答える
3

次の場合を考えてみましょう。

(?:aa|bb|cc)

(?:abc)?

非キャプチャグループを使用して、より複雑なサブパターンを持つパターンを照合できます。場合によっては、非キャプチャグループ構文を使用すると、より効率的な正規表現も得られます。

于 2012-07-10T14:06:32.560 に答える
1

一致を覚えたくない場合は、かっこを完全に破棄しないのはなぜですか?/ x /だけでなく/(?: x)/を使用する利点は何ですか?

文字をグループ化したいが、覚えたくない場合に使用します。括弧を削除すると、文字のシーケンスをグループ化できなくなります。したがって、たとえば:

/foo|bar/.test("foo") // true
/foo|bar/.test("bar") // true

一致するパターンを実現したい場合で、中央の文字をグループ化する必要がfoorあります。fbar

/f(?:oo|ba)r/.test("fbar") // true
/f(?:oo|ba)r/.test("foor") // true

もちろん、グループ化してグループを記憶することもできますが、代わりに、配列が返されるtestusingまたは他のメソッドが重要である場合は、代わりにを使用する必要があります。match(?:

于 2012-07-10T14:15:14.393 に答える