Pattern match to fail if two periods in a row

R

Ralph Shnelvar

Ok ... I really tried. And I used http://rubular.com/ (really nice)

And I read and reread the pickaxe book section on regular
expressions.

In other words ... I tried.

So ..

How does one create an expression that fails if there are two or more periods
(e.g. "..") in a row?
 
J

Jesús Gabriel y Galán

Ok ... I really tried. =A0And I used http://rubular.com/ =A0(really nice)

And I read and reread the pickaxe book section on regular
expressions.

In other words ... I tried.

So ..

How does one create an expression that fails if there are two or more per= iods
(e.g. "..") in a row?
=3D> false

One easy way is to use the negated match operator (!~). Then the
regexp is trivial.

Jesus.
 
L

Louis-Philippe

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

if ! /\.{2,}/

or something
 
R

Ralph Shnelvar

=>> false

I don't think that
"abc..def" !~ /\.\./
is a regular expression.

/\.\./
is a regular expression.


Basically ... I need something that will work in a Rails validates_format_of

# Reject if the email address has two periods in a row
validates_format_of :email,
# See http://en.wikipedia.org/wiki/E-mail_address
:with => ????,
:message => 'invalid email format'
 
L

Louis-Philippe

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

so then only trying to match:

/\w+\.?\w*/

should do
 
R

Robert Klemme

=>> false

I don't think that
"abc..def" !~ /\.\./
is a regular expression.

/\.\./
is a regular expression.


Basically ... I need something that will work in a Rails validates_format_of

# Reject if the email address has two periods in a row
validates_format_of :email,
# See http://en.wikipedia.org/wiki/E-mail_address
:with => ????,
:message => 'invalid email format'

You could try negative lookahead

irb(main):001:0> s=["aaa", "a.", ".a", "a..", "..a"]
=> ["aaa", "a.", ".a", "a..", "..a"]
irb(main):002:0> s.map {|x| [x, /\A(?:.(?!\.\.))*\z/ =~ x]}
=> [["aaa", 0], ["a.", 0], [".a", 0], ["a..", nil], ["..a", 0]]

Or maybe there is an ":without" which uses the negated match?

Kind regards

robert
 
A

Aldric Giacomoni

Ralph said:
How does one create an expression that fails if there are two or more
periods
(e.g. "..") in a row?

As previously mentioned, you can use this:
/\.{2,}/
You can also use this:
/[..+]/

Though of course, you -want- to get 'nil' instead of a match.

On the other hand, if you are looking to validate an email address,
there are already rails plugins that do that (and more) - so why
reinvent the wheel? :)
 
R

Robert Klemme

2009/11/27 Aldric Giacomoni said:
As previously mentioned, you can use this:
/\.{2,}/

That only positively matches strings which contain at least two dots
in a row. OP specifically wanted to _not_ have a match for two dots
in a row.
You can also use this:
/[..+]/

Did you test that? How should this expression match two dots in a
row? You have define a character class with "." and "+" where one dot
is redundant.

irb(main):001:0> /[..+]/ =~ "+"
=> 0
irb(main):002:0> /[..+]/ =~ "."
=> 0
On the other hand, if you are looking to validate an email address,
there are already rails plugins that do that (and more) - so why
reinvent the wheel? :)

If he's reinventing the wheel then that's certainly not a good idea.
I just guess that you are talking about a different wheel. :)

Kind regards

robert
 
A

Aldric Giacomoni

Robert said:
You can also use this:
/[..+]/

Did you test that? How should this expression match two dots in a
row? You have define a character class with "." and "+" where one dot
is redundant.

irb(main):001:0> /[..+]/ =~ "+"
=> 0
irb(main):002:0> /[..+]/ =~ "."
=> 0

I did test it. Just not well. :(
 
S

Steve Wilhelm

Ralph said:
Basically ... I need something that will work in a Rails
validates_format_of

# Reject if the email address has two periods in a row
validates_format_of :email,
# See
http://en.wikipedia.org/wiki/E-mail_address
:with => ????,
:message => 'invalid email format'

From http://github.com/alexdunae/validates_email_format_of

Regex = Regexp.new('^((' + LocalPartUnquoted + ')|(' + LocalPartQuoted +
')+)@(((\w+\-+[^_])|(\w+\.[^_]))*([a-z0-9-]{1,63})\.[a-z]{2,6}$)',
Regexp::EXTENDED | Regexp::IGNORECASE)
 

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,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top