Regexp Matching Not Blank And Not A Specific Word?

A

Andrew Stewart

Hi,

Please could somebody show me how to write a regular expression that
matches when the input is not blank and it's not a specific word,
e.g. dog.

For example, I would hope for these results:

'' =~ regexp # nil
'dog' =~ regexp # nil
'cat' =~ regexp # not nil

I have tried various permutations and combinations involving (?!re)
but I just can't find the answer. In fact I'm beginning to doubt
that (?!re) works at all on my system (Ruby 1.8.6)...but on balance
it's probably me rather than my Ruby installation!

Thanks and regards,
Andy Stewart
 
S

Sebastian Hungerecker

Andrew said:
In fact I'm beginning to doubt =A0
that (?!re) works at all on my system (Ruby 1.8.6)...but on balance =A0
it's probably me rather than my Ruby installation!

It's not you. The ruby 1.8 regexen don't support negative lookahead. You'll
get that in ruby 1.9 or by installing and using the oniguruma regexp-engine
instead of the default ruby 1.8 one.


HTH,
Sebastian
=2D-=20
Jabber: (e-mail address removed)
ICQ: 205544826
 
P

Phrogz

It's not you. The ruby 1.8 regexen don't support negative lookahead. You'll
get that in ruby 1.9 or by installing and using the oniguruma regexp-engine
instead of the default ruby 1.8 one.

Not true:
C:\>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]

C:\>irb
irb(main):001:0> s = "hello world"
=> "hello world"
irb(main):002:0> s.scan /[eo]./
=> ["el", "o ", "or"]
irb(main):003:0> s.scan /[eo](?!r)./
=> ["el", "o "]

It just doesn't support negative or positive *lookbehinds*.
 
P

Phrogz

Hi,

Please could somebody show me how to write a regular expression that
matches when the input is not blank and it's not a specific word,
e.g. dog.

For example, I would hope for these results:

'' =~ regexp # nil
'dog' =~ regexp # nil
'cat' =~ regexp # not nil


irb(main):006:0> tests = [ "", "dog", "cat", "doggone it" ]
=> ["", "dog", "cat", "doggone it"]

irb(main):007:0> tests.each do |str|
irb(main):008:1* hit = (str =~ /^(?!dog).+$|^dog.+$/)
irb(main):009:1> puts "#{str.inspect} => #{hit.inspect}"
irb(main):010:1> end
"" => nil
"dog" => nil
"cat" => 0
"doggone it" => 0
 
J

Judson Lester

[Note: parts of this message were removed to make it a legal post.]

irb(main):006:0> tests = [ "", "dog", "cat", "doggone it" ]
=> ["", "dog", "cat", "doggone it"]

irb(main):007:0> tests.each do |str|
irb(main):008:1* hit = (str =~ /^(?!dog).+$|^dog.+$/)
irb(main):009:1> puts "#{str.inspect} => #{hit.inspect}"
irb(main):010:1> end
"" => nil
"dog" => nil
"cat" => 0
"doggone it" => 0


Just to shill for a moment:

I was doing that kind of irb stuff so often for regexps in Ruby, I wrote
this:

http://rubyforge.org/projects/regexpbench/
http://regexpbench.rubyforge.org/

Hope it's useful.

Judson
 
A

Andrew Stewart

Hi,

Please could somebody show me how to write a regular expression that
matches when the input is not blank and it's not a specific word,
e.g. dog.

For example, I would hope for these results:

'' =~ regexp # nil
'dog' =~ regexp # nil
'cat' =~ regexp # not nil


irb(main):006:0> tests = [ "", "dog", "cat", "doggone it" ]
=> ["", "dog", "cat", "doggone it"]

irb(main):007:0> tests.each do |str|
irb(main):008:1* hit = (str =~ /^(?!dog).+$|^dog.+$/)
irb(main):009:1> puts "#{str.inspect} => #{hit.inspect}"
irb(main):010:1> end
"" => nil
"dog" => nil
"cat" => 0
"doggone it" => 0

That's fantastic, thank you!

When I was trying this yesterday, I think I failed to appreciate that
(?!re) doesn't consume the match. Now I know.

Thanks also for the tip in your previous email about Ruby 1.8 and
lookbehinds.

Regards,
Andy Stewart
 

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

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top