From: benjohn@... Date: 2006-12-13T21:18:08+09:00 Subject: Re: Restricted capture in Regexp > benjohn@fysh.org wrote: > > / ... > >> thanks for the reply. I know I can do this, but it means that the >> substitution ("\\1\\2\\3") has to be aware of the composition of the >> regular expression. > > Yes, that is true for all regular expressions. > >> The Regexp is no longer a neat little machine that >> only grabs things to replace. It's now grabbing the packaging around >> the >> thing to replace too, so you've got to be aware of this in writing the >> substitution. > > Yes, but this cannot be avoided. You have two choices for examined text > that > surrounds the area to be modified -- you can capture it while examining > it, > and use the captured text in the replacement, or you can use > non-capturing > references: > > (?=non-captured text) I think this may be what I should use. Also, the sugestion of using word edge tokens works for the specific case. > > But the two alternatives work much the same way -- they examine text > that is > preserved as part of the overall regular expression. All that changes > is /how/ the text is preserved. > > So, to move ahead, please post a specific example of what you need. Post > an > example of the original string and the desired replacement. :) Well, I have a solution for the specific case. That's not what I'm getting at though. I'm trying to find out if regexp allow me to do something more general. I want to do this (sorry, I don't have a ruby to hand): class CodeFragment attr_accessor :code_fragment def variables_regexp /\b[xyz]\b/ end def utilised_variables code_fragment.scan(variables_regexp).uniq.sort end def output_substitution(substitutes) code_fragment.gsub(variables_regexp) do |v| substitutes[v[0]] end end end cf = CodeFragment.new cf.code_fragment = "sin(x+y)" puts cf.output_substitution({'x'=>1, 'y'=>2}) should give "sin(1+2)" What I want is for the thing that provides the regular expression to not need to know about the function that is using it; and for the functions that uses the regular expression to not know about the expression provided. > regular > expression. It /is/ possible to take a first step by posting an example > of > original text, and replacement text. Maybe we should try that. Thank you for your help here. I'm not trying to solve a single problem though, I'm trying to understant what kinds of problem I can solve. I want something that acts as an abstract machine for finding things in a string (in this case variables, but the rules could be more complex). One should be able to use this machine without knowing what it finds, or how it finds. All I should need to know is that it finds things. I'm trying to understand if regexps are able to do this - to provide this separation. Perhaps they don't, which is fine. I'd just like to know if they do or not, or if they do a bit, how much. Thanks, Benjohn