web-dev-qa-db-ja.com

Ruby正規表現-gsubは一致するものを保存しますか?

私が使用する場合

.gsub(/matchthisregex/,"replace_with_this")

gsubは、正規表現と一致するものをどこかに保存しますか?一致するものを置換文字列で使用したいと思います。たとえば、

"replace_with_" + matchedregexstring + "this"

上記の例では、matchedregexstringはgsubからの保存された一致になりますか?それが混乱していた場合は申し訳ありませんが、私はそれを他にどのように言葉にするかわかりません。

19
Tommy

細かいマニュアル から:

replacementStringの場合、一致したテキストに置き換えられます。 \ddはグループ番号)または\k<n>nはグループ名)の形式のパターンのキャプチャグループへの後方参照が含まれる場合があります。二重引用符で囲まれた文字列の場合は、両方の後方参照の前に追加の円記号を付ける必要があります。ただし、replacement内では、&$などの特別な一致変数は、現在の一致を参照しません。
[...]
ブロック形式では、現在の一致文字列がパラメーターとして渡され、$1$2、$ `、$&$'などの変数が適切に設定されます。ブロックによって返される値は、各呼び出しの一致に置き換えられます。

キャプチャグループ(つまり、正規表現の(expr)など)を気にしない場合は、ブロックフォームと$&を使用できます。

>> 'where is pancakes house?'.gsub(/is/) { "-#{$&}-" }
=> "where -is- pancakes house?"

キャプチャグループがある場合は、置換文字列で\nを使用できます。

>> 'where is pancakes house?'.gsub(/(is)/, '-\1-')
=> "where -is- pancakes house?"

またはブロック内の$n

>> 'where is pancakes house?'.gsub(/(is)/) { "-#{$1}-" }
=> "where -is- pancakes house?"
33
mu is too short

すべてのRubyバージョンの場合:一致する文字列を取得する簡単な方法。

.gsub(/matched_sym/) {|sym| "-#{sym}-"}
4
devudilip

here gsubの一致には、実際にはRegexp.last_match変数(クラス MatchData )を介して次のようにアクセスできることがわかりました。

my_string.gsub(my_regexp){ Regexp.last_match.inspect }

より実用的な例を挙げると、すべての一致をログに記録する場合は、次のように使用できます。

"Hello world".gsub(/(\w+)/) { Regexp.last_match.captures.each{ |match| Rails.logger.info "FOUND: #{match}"} }

#Rails log:
FOUND: Hello
FOUND: world

特定のケースでは、次のようなことができます。

mystring.gsub(/(matchthisregex)/){ mystring = "replace_with_#{Regexp.last_match[0].to_s}this"}
4
clami219