4

次のケースがあり、期待どおりに機能せず、何か間違ったことをしていますが、それが何であるかを見つけることができません。スクリプトは、文内の 4 文字の単語に一致します。一致したグループを反復処理する方法を見つけたいです。

x = "This is a statement with four letter words like this"
result = x.match /(\b\w{4}\b)/
=> #<MatchData "This" 1:"This"> 

残念ながら、$1が含まれています"This"が、これがすべてです。$2含まれているはずですが"with"、そうですnil。私は何を間違っていますか?なぜ$2 nilですか?なぜゼロと$n一緒ですか?n>=2

4

1 に答える 1

5

これは、正規表現が 1 回だけ一致し、キャプチャ グループが 1 つだけ含まれているためです。

あなたはおそらく欲しい:

x.scan /\b\w{4}\b/

これにより、すべての一致の配列が得られます。

$1$2... 正規表現の単一の一致でグループに設定されます。

x.match(/(\b\w{4}\b).*(\b\w{4}\b)/)

およびに設定$1します。'This'$2'this'

$~[1]グループには、 、$~[2]、 ... またはRegexp.last_match[1]...からもアクセスできます。

于 2013-10-04T08:29:55.790 に答える