regular expressions and search() - vertical bar problem

W

Ward Cleaver

Hi. I have an assignment to do some validating of a form using
javascript and mostly the search() method. I'm having problems
getting a positive validation for phone numbers like "123-456-7890"
and "123.456.7890" but not like "123.456-7890". The regular
expression I'm using now is something like this:
ok = pn.search(/(^\d{3}-\d{3}-\d{4}$)|(^\d{3}.\d{3}.\d{4}$)/);
Which to me looks like it SHOULD do what I want it to and not come
back with an ok=0 for a phone number using both hyphens and periods.
Please help.
 
R

RobG

Ward said:
ok = pn.search(/(^\d{3}-\d{3}-\d{4}$)|(^\d{3}.\d{3}.\d{4}$)/);

I'm guessing...

(/(^\d{3}(-|.)\d{3}(-|.)\d{4}$)/)

should do the trick for all cases.

You could also use:

(/((\d{3}(-|.)){2}\d{4}$)/)

but that will produce +ve values if extra characters are
added to the front of the test string - only zero (0) will
be a correct result or any non-zero value a fail. For the
sake of saving a few characters, I don't think it's worth
it.

Cheers.
 
M

Michael Winter

Hi. I have an assignment

If you mean an educational course assignment, you're probably required to
mention that you received help.
to do some validating of a form using javascript and mostly the search()
method.

String.prototype.search is generally unsuitable for validation. If you
want to assert that a string matches a pattern, use RegExp.prototype.test:

/<pattern>/.test(<string>)

which returns true for a match. The search method returns the position
where a match was found.
I'm having problems getting a positive validation for phone numbers like
"123-456-7890" and "123.456.7890" but not like "123.456-7890". The
regular expression I'm using now is something like this:
ok = pn.search(/(^\d{3}-\d{3}-\d{4}$)|(^\d{3}.\d{3}.\d{4}$)/);

An unescaped dot (period) matches *any* character (except line
terminators). A literal dot needs to written with a backslash prefix.
Which to me looks like it SHOULD do what I want it to and not come back
with an ok=0 for a phone number using both hyphens and periods.
Please help.

Though I recommended the test method, I'd probably use
RegExp.prototype.exec so I could check that the separators match:

var r = /^\d{3}([.-])\d{3}([.-])\d{4}$/.exec(pn);

/* If the string didn't match, r will be null.
* If it did match, r will be an array with element
* 0 containing the match
* 1 containing the first remembered match (marked with
* parentheses)
* 2 containing the second remembered match
*/
if(r && (r[1] == r[2])) {
// Pattern matched and the separators are equal.
}

Good luck,
Mike
 
D

Dr John Stockton

JRS: In article <[email protected]>,
dated Tue, 28 Sep 2004 15:45:51, seen in Ward
Cleaver said:
I have an assignment to do some validating of a form using
javascript and mostly the search() method. I'm having problems
getting a positive validation for phone numbers like "123-456-7890"
and "123.456.7890" but not like "123.456-7890". The regular
expression I'm using now is something like this:
ok = pn.search(/(^\d{3}-\d{3}-\d{4}$)|(^\d{3}.\d{3}.\d{4}$)/);
Which to me looks like it SHOULD do what I want it to and not come
back with an ok=0 for a phone number using both hyphens and periods.


Dot matches any character; use \. . Testing only with more-or-less
valid data is a distressingly common mistake; a test with a non-allowed
first separator would have given a clue. Build up such expressions in
small stages, testing as you go.

Search returns a number; to get a Boolean for OK, use test.

OK = /^(\d\d\d)([-\.])(\d\d\d)\2(\d\d\d\d)$/.test(pn)

Be aware that by using that format only you exclude many of the
telephones in North America and elsewhere.
 
R

rh

"Michael Winter" wrote:
Though I recommended the test method, I'd probably use
RegExp.prototype.exec so I could check that the separators match:

var r = /^\d{3}([.-])\d{3}([.-])\d{4}$/.exec(pn);

/* If the string didn't match, r will be null.
* If it did match, r will be an array with element
* 0 containing the match
* 1 containing the first remembered match (marked with
* parentheses)
* 2 containing the second remembered match
*/
if(r && (r[1] == r[2])) {
// Pattern matched and the separators are equal.
}

Alternatively, including a backreference in the regular expression
would allow use of the preferred test method, e.g.:

if ( /^\d{3}([-.])\d{3}\1\d{4}$/.test(pn) ) {
// Pattern matched and the separators are equal.
}

../rh
 
M

Michael Winter

[snip]
Alternatively, including a backreference in the regular expression would
allow use of the preferred test method, e.g.:

I didn't know they existed as an ECMA-262 conformant pattern but I have
just found it (section 15.10.2.11). How well supported are they?

Thanks,
Mike
 
R

rh

Michael Winter said:
[snip]
Alternatively, including a backreference in the regular expression would
allow use of the preferred test method, e.g.:

I didn't know they existed as an ECMA-262 conformant pattern but I have
just found it (section 15.10.2.11). How well supported are they?

RegExp backreferences were present in v1.2. I believe it's possible to
use said same with gay abandon :).

../rh
 

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,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top