Hi, all
In my project, there are some rules using global expression( '*'
as one or more characters ) to match some functions’ output.
Such as:
rule1e$B!'e(B the * apple (will match the output “the red
apple”)
rule2e$B!'e(B the * + * game (will match the output “the
wonderful +
successful game”)
I want to use ruby to realize the match check, but I only know
ruby supports regular expression.
So I have to change rules to the form of regular expressions( “*” => “.
+” and add ‘’ to other regular expession keywords like ‘+’, ‘.’ etc.)
Is there any way to use global expression directly in ruby?
Thanks
On Mon, Jan 12, 2009 at 2:59 PM, Jarod Z. [email protected]
wrote:
ruby supports regular expression.
So I have to change rules to the form of regular expressions( “*” => “.
+” and add '' to other regular expession keywords like ‘+’, ‘.’ etc.)
Is there any way to use global expression directly in ruby?
No, better make it ourselves
class String
def escape
return “” if empty?
Regexp::escape self
end
def glob? a_string
Regexp::new(
scan( /(.?)*([^]*)/ ).
inject(“”) { | r , ( prefix, suffix ) | r << prefix.escape <<
‘\w+’ << suffix.escape }
).match( a_string )
end
end
p “ab cd*”.glob?( “ab andcordequally” )
p “a*b”.glob?( “ab” )
p “etc.etc.”
HTH
R.
On 12.01.2009 15:33, Robert D. wrote:
I want to use ruby to realize the match check, but I only know
Regexp::escape self
p “ab cd*”.glob?( “ab andcordequally” )
p “a*b”.glob?( “ab” )
p “etc.etc.”
Small remark: I’d split this up, i.e.
class String
def to_glob
Regexp::new(
scan( /(.?)*([^]*)/ ).
inject("") { | r , ( prefix, suffix ) |
r << prefix.escape << ‘\w+’ << suffix.escape }
)
end
end
This makes for more efficient matching if the pattern is to be applied
to multiple strings.
Here’s how I’d do it:
class String
def to_glob
Regexp.new(’\A’ << gsub(/\([^?])/, ‘\1’).split(/(\?[?])/).map
do |s|
case s
when ‘’: '.’
when ‘?’: ‘.’
when ‘\*’, ‘\?’: s
else Regexp.escape(s)
end
end.join << ‘\z’)
end
end
gl = “foo*b\ar\*a”.to_glob
p gl
%w{foo foobara foo123bar foobara}.each do |s|
p [s, gl =~ s]
end
Kind regards
robert
On Mon, Jan 12, 2009 at 8:39 PM, Robert K.
[email protected] wrote:
Small remark: I’d split this up, i.e.
Spoiling all the fun for the profilers
Good point though.
Robert