0

グループ内の試合の一部を除外することは可能かどうか疑問に思っています。

その/(foo((?:bar)|(bad)))/結果、「foobar」または「foobad」と、「foobar」または「foobad」を含むグループ 1 が一致すると思います。「foobar」または「foobad」と一致させたいのですが、グループ 1 には「foo」または「foobad」しか含まれていません。(?:...)後で参照できないグループを作成するために正規表現構文が使用されることは知っていますが、上記の使用法は 3 つのグループがあることを意味します。\2 'bar' または 'bad'; \NONE は未使用のグループ 'bar' です。\3 は「悪い」を表します。

私がここに行くところがわかりますか?必要に応じて、サブグループを別のグループから除外したいと考えています。

または、グループ 1 を OR 形式で 2 回定義したいと思い/(foobar)|(foobad)/ますが、入力が思いどおりにならないことはわかっています。その場合、match[1]入力として「foobad」を指定すると、アクセスしようとすると「未定義」エラーが発生します。これは、実際にグループ 1 またはグループ 2 に分割されているためです。

私はこれをjavascript正規表現方言で書いています。

4

3 に答える 3

4

「foobar」または「foobad」と一致させたいのですが、グループ 1 には「foo」または「foobad」しか含まれていません。

正規表現:

/(foo(?:(?=bar)|bad))/

それを行います: グループ 1 は (その直後にあるfoo場合のみ) を含むか、または を含みます。barfoobad

于 2011-04-03T19:40:43.487 に答える
0

これはあなたが望むものに近いです

/((?=foobar)foo|foobad)/

のいずれかに一致する単一のグループですfoo(ただし、それで始まる場合のみ一致しますfoobar) またはfoobad. フォーム(?=...)はゼロ幅の先読みアサーションです。

の場合の一致foobarはちょうどですfooが、IMO はそれを foobar と一致させることができますが、foobad が一致する同じグループ内の foo のみをグループ化するには、代わりに後読みが必要であり、AFAIK は JavaScript では使用できないため、これはまさにあなたが望むものではありません。

于 2011-04-03T19:58:52.830 に答える
0

(?:bar)- 一致バーが、一致を覚えていません。これらは非キャプチャ括弧と呼ばれます。[1], ..., [n]一致した部分文字列は、結果の配列の要素または定義済みの RegExp オブジェクトのプロパティから呼び出すことはできません$1, ..., $9

詳細情報: Mozilla Developer Center

于 2011-04-03T19:34:58.180 に答える