Regular expression to match phone number?

吃可爱长大的小学妹 提交于 2019-12-02 00:09:20
Heath Hunnicutt

You seek the alternation operator, indicated with pipe character: |

However, you may need either 7 alternatives (1 for each hyphen location + 1 for no hyphen), or you may require the hyphen between 3rd and 4th character and use 2 alternatives.

One use of alternation operator defines two alternatives, as in:

({3,3}[0-9A-Za-z]-{4,4}[0-9A-Za-z]|{7,7}[0-9A-Za-z])

I think this should do it:

/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/

It matches 3 letters or numbers followed by an optional hyphen followed by 4 letters or numbers. This one works in ruby. Depending on the regex engine you're using you may need to alter it slightly.

Not sure if this counts, but I'd break it into two regexes:

#!/usr/bin/perl

use strict;
use warnings;

my $text = '333-URGE';

print "Format OK\n" if $text =~ m/^[\dA-Z]{1,6}-?[\dA-Z]{1,6}$/;
print "Length OK\n" if $text =~ m/^(?:[\dA-Z]{7}|[\dA-Z-]{8})$/;

This should avoid accepting multiple dashes, dashes in the wrong place, etc...

Supposing that you want to allow the hyphen to be anywhere, lookarounds will be of use to you. Something like this:

^([A-Z0-9]{7}|(?=^[^-]+-[^-]+$)[A-Z0-9-]{8})$

There are two main parts to this pattern: [A-Z0-9]{7} to match a hyphen-free string and (?=^[^-]+-[^-]+$)[A-Z0-9-]{8} to match a hyphenated string.

The (?=^[^-]+-[^-]+$) will match for any string with a SINGLE hyphen in it (and the hyphen isn't the first or last character), then the [A-Z0-9-]{8} part will count the characters and make sure they are all valid.

Thank you Heath Hunnicutt for his alternation operator answer as well as showing me an example.

Based on his advice, here's my answer:

[A-Z0-9]{7}|[A-Z0-9][A-Z0-9-]{7}

Note: I tested my regex here. (Just including this for reference)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!