Forum: Ruby Does ruby support global expression?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Jarod Z. (Guest)
on 2009-01-12 16:00
(Received via mailing list)
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・3校  the * apple   (will match the output "the red
apple")
     rule2・3校  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
Robert D. (Guest)
on 2009-01-12 16:34
(Received via mailing list)
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 *c*d*".glob?( "ab andcordequally" )
p "a*b".glob?( "ab" )
p "etc.etc."


HTH
R.
Robert K. (Guest)
on 2009-01-12 21:40
(Received via mailing list)
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 *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
Robert D. (Guest)
on 2009-01-12 22:01
(Received via mailing list)
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 ;)
Good point though.
Robert
This topic is locked and can not be replied to.