benjohn
12/13/2006 12:18:00 PM
> 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