Does ruby support global expression?


#1

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


#2

On Mon, Jan 12, 2009 at 2:59 PM, Jarod Z. removed_email_address@domain.invalid
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.


#3

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


#4

On Mon, Jan 12, 2009 at 8:39 PM, Robert K.
removed_email_address@domain.invalid wrote:

Small remark: I’d split this up, i.e.
Spoiling all the fun for the profilers :wink:
Good point though.
Robert