5

これは私がやっていることです

a = "%span.rockets#diamonds.ribbons.forever"
a = a.match(/(^\%\w+)([\.|\#]\w+)+/)
puts a.inspect

これは私が得るものです

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever">

これは私が欲しいものです

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever">

ヘルプ?私は試して失敗しました:(

4

2 に答える 2

9

通常、任意の数のキャプチャ グループを取得することはできませんが、使用すると、キャプチャするすべてのトークンに一致scanするものを取得できます。

a = "%span.rockets#diamonds.ribbons.forever"
a = a.scan(/^%\w+|\G[.|#]\w+/)
puts a.inspect

["%span", ".rockets", "#diamonds", ".ribbons", ".forever"]

これは正規表現と大差ありませんが、最後のトークンの繰り返しを削除しました。\Gはあまり知られていません - 前の一致が終了した場所で一致するようにエンジンに指示するため、一致の間に余分な文字がある場合でも壊れません ( %span :P .rockets)。

一般に、元の正規表現に複数の一致がある場合、このメソッドはいくつかの作業を追加する可能性があります。これは、グループを一致ごとに分離していないためですがmatch、単一の結果を返すため、正常に機能するはずです。

作業例: http://ideone.com/nnmki

于 2010-09-06T04:43:06.187 に答える
3

これが、キャプチャ グループの仕組みです。これらの部分文字列をすべて保存する場合は、量指定子をキャプチャ グループ内に配置します。

a = a.match(/(^%\w+)((?:[.#]\w+)+)/)

次に、2 番目のキャプチャは次のようになります。

2:".rockets#diamonds.ribbons.forever"

...あとは自分で分解できます。

于 2010-09-06T04:25:12.790 に答える