CHAPTER SIXTEEN
287
You aren’t limited merely to extracting and displaying characters verbatim; you can also modify text. This example, displays the text from a Ruby file but changes all Ruby line-comment characters (‘#’) preceding full-line comments to C-style line-comments (‘//’): regex4.rb File.foreach( 'regex1.rb' ){ |line| line = line.sub(/(^s*)#(.*)/, '1//2') puts( line ) } In this example, the sub method of the String class has been used; this takes a regular expression as its first argument (here /(^s*)#(.*)/) and a replacement string as the second argument (here '1//2') . The replacement string may contain numbered place-holders such as 1 and 2 to match any groups in the regular expression - here there are two groups between round brackets: (^s*) and (.*). The sub method returns a new string in which the matches made by the regular expression are substituted into the replacement string, while any un-matched elements (here the # character, are omitted).
MATCHDATA
The =~ ‘operator’ is not the only means of finding a match. The Regexp class also has a match method. This works in similar way to =~ but, when a match is made, it returns a MatchData object rather than an integer. A MatchData object contains the result of a pattern match. At first sight, this may appear to be a string< match.rb puts( /cde/ =~ 'abcdefg' ) #=> 2 puts( /cde/.match('abcdefg') ) #=> cde In fact, it is an instance of the MatchData class which contains a string: p( /cde/.match('abcdefg') ) #=> #