Disable regexp warning

Hi there !

Is there a way to disable regexp warning ?

I want to do this:

begin
  re = /#{str}/
rescue
  # invalid regexp
  return "<span class='parser_error'>invalid regexp #{str.inspect}</span>"
end

without having tons of messages printed on stderr. Any clue ?

Thanks,

Gaspard

I don't see your problem.

···

===
def test
   str = "a*("

   begin
     re = /#{str}/
   rescue RegexpError => e
     # invalid regexp
     "<span class='parser_error'>invalid regexp #{str.inspect}: #{e.message}</span>"
   end
end

puts test.inspect

doesn't print any errors. I double checked that warnings are on and the warning level was set to highest.

If it does not work with your ruby version, please post the version string of you ruby installation (obtained by "ruby -v").

Regards,
Florian Gilcher

On May 13, 2008, at 3:08 PM, Gaspard Bucher wrote:

Hi there !

Is there a way to disable regexp warning ?

I want to do this:

begin
re = /#{str}/
rescue
# invalid regexp
return "<span class='parser_error'>invalid regexp #{str.inspect}</>"
end

without having tons of messages printed on stderr. Any clue ?

Thanks,

Gaspard

This is crazy. When I write a simple test case with your example it
works just fine but I still get this message when running all the
tests:
/lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has invalid interval
./lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has `}'
without escape
compiled-template:1: warning: regexp has invalid interval
compiled-template:1: warning: regexp has `}' without escape

This message does not come from the simple test I wrote but from this test:
ruby test/helpers/zena_parser_test.rb --name test_basic_show_mean_gsub

[edit] Ok, I found the problem:

  def test_bad_regexp
    assert_equal "<span class='parser_error'>invalid regexp \"# {puts
'I AM MEAN'}\"", validate_regexp("# {puts 'I AM MEAN'}")
  end

  private
    def validate_regexp(str)
      begin
       re = /#{str}/
      rescue => e
       # invalid regexp
       "<span class='parser_error'>invalid regexp #{str.inspect}</span>"
      end
    end

The regexp is seen as valid even though it is not. It's the actual run
of the regexp in a gsub that prints the error message.

Is there a way to detect this error ?

Thanks for your help.

Gaspard

Here is the code in place:
http://dev.zenadmin.org/browser/trunk/lib/parser/lib/rules/zena.rb#L231

···

On Tue, May 13, 2008 at 3:44 PM, Florian Gilcher <flo@andersground.net> wrote:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I don't see your problem.

===
def test
  str = "a*("

  begin
    re = /#{str}/
  rescue RegexpError => e
    # invalid regexp
    "<span class='parser_error'>invalid regexp #{str.inspect}:
#{e.message}</span>"
  end
end

puts test.inspect

doesn't print any errors. I double checked that warnings are on and the
warning level was set to highest.

If it does not work with your ruby version, please post the version string
of you ruby installation (obtained by "ruby -v").

Regards,
Florian Gilcher

On May 13, 2008, at 3:08 PM, Gaspard Bucher wrote:

> Hi there !
>
> Is there a way to disable regexp warning ?
>
> I want to do this:
>
> begin
> re = /#{str}/
> rescue
> # invalid regexp
> return "<span class='parser_error'>invalid regexp #{str.inspect}</span>"
> end
>
> without having tons of messages printed on stderr. Any clue ?
>
> Thanks,
>
> Gaspard
>
>

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)

iEYEARECAAYFAkgpmyoACgkQJA/zY0IIRZbOSwCeNQelH1ZsQkg7wD6LjFtQwEwy
HYEAoKXytOhB9IkwM4HC7vaGpwkWzLaa
=CkEQ
-----END PGP SIGNATURE-----

Well the regexp you're testing IS valid, perhaps it's not the regexp
you think it is:

irb(main):009:0> a = "#{puts 'I am mean'}"
I am mean
=> ""
irb(main):010:0> a
=> ""
irb(main):011:0> /#{a}/
=> //

Remember that puts return nil, and nil.to_s is an empty string.

···

On Wed, May 14, 2008 at 3:27 AM, Gaspard Bucher <gaspard@teti.ch> wrote:

This is crazy. When I write a simple test case with your example it
works just fine but I still get this message when running all the
tests:
/lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has invalid interval
./lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has `}'
without escape
compiled-template:1: warning: regexp has invalid interval
compiled-template:1: warning: regexp has `}' without escape

This message does not come from the simple test I wrote but from this test:
ruby test/helpers/zena_parser_test.rb --name test_basic_show_mean_gsub

[edit] Ok, I found the problem:

def test_bad_regexp
   assert_equal "<span class='parser_error'>invalid regexp \"# {puts
'I AM MEAN'}\"", validate_regexp("# {puts 'I AM MEAN'}")
end

private
   def validate_regexp(str)
     begin
      re = /#{str}/
     rescue => e
      # invalid regexp
      "<span class='parser_error'>invalid regexp #{str.inspect}</span>"
     end
   end

The regexp is seen as valid even though it is not. I

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

There is a space after '#'. The test actually makes sure no one can
inject ruby. So the role of the function to test is to replace '#{..}'
by '# {...}', but then the {..} is invalid but does not raise an
exception which is annoying.

···

On Wed, May 14, 2008 at 3:05 PM, Rick DeNatale <rick.denatale@gmail.com> wrote:

On Wed, May 14, 2008 at 3:27 AM, Gaspard Bucher <gaspard@teti.ch> wrote:

This is crazy. When I write a simple test case with your example it
works just fine but I still get this message when running all the
tests:
/lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has invalid interval
./lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has `}'
without escape
compiled-template:1: warning: regexp has invalid interval
compiled-template:1: warning: regexp has `}' without escape

This message does not come from the simple test I wrote but from this test:
ruby test/helpers/zena_parser_test.rb --name test_basic_show_mean_gsub

[edit] Ok, I found the problem:

def test_bad_regexp
   assert_equal "<span class='parser_error'>invalid regexp \"# {puts
'I AM MEAN'}\"", validate_regexp("# {puts 'I AM MEAN'}")
end

private
   def validate_regexp(str)
     begin
      re = /#{str}/
     rescue => e
      # invalid regexp
      "<span class='parser_error'>invalid regexp #{str.inspect}</span>"
     end
   end

The regexp is seen as valid even though it is not. I

Well the regexp you're testing IS valid, perhaps it's not the regexp
you think it is:

irb(main):009:0> a = "#{puts 'I am mean'}"
I am mean
=> ""
irb(main):010:0> a
=> ""
irb(main):011:0> /#{a}/
=> //

Remember that puts return nil, and nil.to_s is an empty string.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

I still cannot find a solution to disable regex warning in the
following situation:

def valid_regexp?(str)
  begin
    re = /#{str}/
    true
  rescue
    false
  end
end

# should return false and not print a warning
valid_regexp?("foo{bar}")
=> true, prints warning...

Many thanks for your help, advice.

Gaspard

should print "bad regexp", but returns

···

On Thu, May 15, 2008 at 12:01 AM, Gaspard Bucher <gaspard@teti.ch> wrote:

There is a space after '#'. The test actually makes sure no one can
inject ruby. So the role of the function to test is to replace '#{..}'
by '# {...}', but then the {..} is invalid but does not raise an
exception which is annoying.

On Wed, May 14, 2008 at 3:05 PM, Rick DeNatale <rick.denatale@gmail.com> wrote:

On Wed, May 14, 2008 at 3:27 AM, Gaspard Bucher <gaspard@teti.ch> wrote:

This is crazy. When I write a simple test case with your example it
works just fine but I still get this message when running all the
tests:
/lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has invalid interval
./lib/parser/test/../lib/rules/zena.rb:231: warning: regexp has `}'
without escape
compiled-template:1: warning: regexp has invalid interval
compiled-template:1: warning: regexp has `}' without escape

This message does not come from the simple test I wrote but from this test:
ruby test/helpers/zena_parser_test.rb --name test_basic_show_mean_gsub

[edit] Ok, I found the problem:

def test_bad_regexp
   assert_equal "<span class='parser_error'>invalid regexp \"# {puts
'I AM MEAN'}\"", validate_regexp("# {puts 'I AM MEAN'}")
end

private
   def validate_regexp(str)
     begin
      re = /#{str}/
     rescue => e
      # invalid regexp
      "<span class='parser_error'>invalid regexp #{str.inspect}</span>"
     end
   end

The regexp is seen as valid even though it is not. I

Well the regexp you're testing IS valid, perhaps it's not the regexp
you think it is:

irb(main):009:0> a = "#{puts 'I am mean'}"
I am mean
=> ""
irb(main):010:0> a
=> ""
irb(main):011:0> /#{a}/
=> //

Remember that puts return nil, and nil.to_s is an empty string.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

Hi,

Gaspard Bucher wrote:

I still cannot find a solution to disable regex warning in the
following situation:

def valid_regexp?(str)
  begin
    re = /#{str}/
    true
  rescue
    false
  end
end

# should return false and not print a warning
valid_regexp?("foo{bar}")
=> true, prints warning...

You can do something like this:

def valid_regexp?(str)
  begin
    output = StringIO.open('','w')
    $stderr = output
    re = /#{str}/
    output.string !~ /warning:/
  rescue
    false
  ensure
    $stderr = STDERR
  end
end

# should return false and not print a warning
valid_regexp?("foo{bar}")

Regards,

Park Heesob

···

--
Posted via http://www.ruby-forum.com/\.

Thanks Heesob Park !

That's exactly what I needed.

Gaspard

···

On Sun, May 18, 2008 at 9:59 AM, Heesob Park <phasis@gmail.com> wrote:

Hi,

Gaspard Bucher wrote:

I still cannot find a solution to disable regex warning in the
following situation:

def valid_regexp?(str)
  begin
    re = /#{str}/
    true
  rescue
    false
  end
end

# should return false and not print a warning
valid_regexp?("foo{bar}")
=> true, prints warning...

You can do something like this:

def valid_regexp?(str)
begin
   output = StringIO.open('','w')
   $stderr = output
   re = /#{str}/
   output.string !~ /warning:/
rescue
   false
ensure
   $stderr = STDERR
end
end

# should return false and not print a warning
valid_regexp?("foo{bar}")

Regards,

Park Heesob
--
Posted via http://www.ruby-forum.com/\.