Does ruby support global expression?

J

Jarod Zhu

Hi, all

In my project, there are some rules using global expression( '*'
as one or more characters ) to match some functions' output.
Such as:
rule1$B!'(B the * apple (will match the output "the red apple")
rule2$B!'(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
 
R

Robert Dober

Hi, all

In my project, there are some rules using global expression( '*'
as one or more characters ) to match some functions' output.
Such as:
rule1$B!'(B the * apple (will match the output "the red apple")
rule2$B!'(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?
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 *c*d*".glob?( "ab andcordequally" )
p "a*b".glob?( "ab" )
p "etc.etc."


HTH
R.
 
R

Robert Klemme

Hi, all

In my project, there are some rules using global expression( '*'
as one or more characters ) to match some functions' output.
Such as:
rule1: the * apple (will match the output "the red apple")
rule2: 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?
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 *c*d*".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 foobar*a foo123bar foobar*a}.each do |s|
p [s, gl =~ s]
end

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,141
Latest member
BlissKeto
Top