/ /正規表現トークンの間にリテラルスペースがあると、異なるマッチデータオブジェクトにつながるのはなぜですか? - ルビー、正規表現

正規表現トークンの間にリテラルスペースがあると、異なるマッチデータオブジェクトにつながるのはなぜですか? - ルビー、正規表現

たとえば、次の式を考えます。

no_space = "This is a test".match(/(w+)(w+)/)
with_space = "This is a test".match(/(w+) (w+)/)

表現 no_space マッチデータオブジェクトになりました #<MatchData "This" 1:"Thi" 2:"s">、while with_space#<MatchData "This is" 1:"This" 2:"is">。ここで何が起こっているのですか? トークン間の文字通りのスペースは、できるだけ複数の単語にマッチしなければならないことをルビに示すように思えますが、スペースを持たないとマッチは1語に制限されます。被験者の説明や説明があれば歓迎されます。

ありがとう。

回答:

回答№1は1

w スペースにマッチしない + あなたがそれをフォローしない限り、貪欲です ?、Rubyは多くのものと一致させようとします w 可能な限り、表現の残りの部分が一致する限り、効果的に消費する Thi 最初のキャプチャでは、 s 2番目に

スペースを追加すると、Rubyは多くのものとマッチします w 空白文字まで、そしてそれ以上 w、したがって一致 This そして is.

これが明確でない場合は教えてください。


回答№2の場合は0

正規表現では /(w+)(w+)/、一致できる唯一の文字は単語文字(英字、数字、アンダースコア)。正規表現は文字列中の連続した文字としか一致しませんので、正規表現に何かを入れて単語間のスペースをマッチさせない限り、正規表現は複数の単語にマッチすることはできません。