----- menupriority: 1 kind: article created_at: 2009-09-22T22:13:25+02:00 title: Remplacer tout sauf une partie author_name: Yann Esposito author_uri: yannesposito.com tags: - ruby - regexp - regular expression ----- My problem is simple: I want to filter a text except some part of it. I can match easily the part I don't want to be filtered. For example
... text ... BEGIN not to filter ... text ... END not to filter ... text ...
I searched a better way to do that, but the best I can do is using `split` and `scan`.
def allExceptCode( f, content ) regexp=/]*>.*?<\/code>/m tmp="" mem=[] content.scan(regexp).each do |c| mem <<= c end i=0 content.split(regexp).each do |x| tmp <<= send(f,x) if not mem[i].nil? tmp <<= mem[i] i+=1 end end tmp end
An usage is:
def filter(content) content.gsub(/e/,'X') end ... allExceptCode(:filter, content) ...
A better syntax would be:
# !!!!!!!!!! THIS SYNTAX DOES NOT WORK !!!!!!! # def allExceptCode( f, content ) regexp=/]*>.*?<\/code>/m tmp="" content.split(regexp).each do |x| separator=$& tmp <<= send(f,x) if not separator.nil? tmp <<= separator end end tmp end
I would expect the split make a search on a regular expression and then give the matched expression into the `$&` variable. But it is not the case. If someone know a nicer way to do that I will be happy to know how.