4

そのため、別のスタック オーバーフローの質問に多くの時間を費やしましたが、以前の問題でも同じ問題が発生しました。非捕獲グループは、私が期待するように機能していません。またはそう信じています。

これは、他の誰かの CSS テスト文字列に沿ったばかげた例です...

これが私の正規表現です:

(?:(rgb\([^)]*\)|\S+)(?:[ ]+)?)*

テスト文字列は次のとおりです。

1px solid rgb(255, 255, 255) test rgb(255, 255, 255)

「1px」、「solid」、「rgb(255, 255, 255)」、「test」、「rgb(255, 255, 255)」の一致グループを期待しています

しかし、一致した最後のトークンしか取得していません。

これはテスト用のリンクです。

http://regex101.com/r/pK1uG7

ここで何がうまくいかないのですか?非キャプチャ グループがダウンしていると思いました。regex101 の下部で説明されている方法は、「貪欲」を含めて理にかなっています。

4

2 に答える 2

3

キャプチャ グループは、以前の各一致を上書きします。キャプチャ グループ #1 は最初に "1px" に一致し、次にキャプチャ グループ #1 は "1px" を上書きする "solid" に一致し、次に "solid" を上書きする "rgb(255, 255, 255)" に一致します。

于 2013-10-25T22:30:25.733 に答える
2

これには、グローバル オプションを使用する必要があります。

/(rgb\([^)]+\)|\S+)/g

http://regex101.com/r/kF2uV4

非キャプチャ グループは、その結果をグループから除外します。したがって、一致させたい場合:

"1px","solid", "rgb(255, 255, 255)", "test", "rgb(255, 255, 255)"

次に、キャプチャ グループをそのように使用したくありません。

参照:非キャプチャ グループとは? 疑問符の後にコロン (?:) が続くとはどういう意味ですか?

上部にある Ricardo Nolde の回答を参照してください。あなたは、あなたが取り戻したいと言っているものを排除しています。

于 2013-10-25T22:29:27.550 に答える