Reputation: 32635
I want to match a phone number that can have letters and an optional hyphen:
333-WELL
4URGENT
In other words, there can be at most one hyphen but if there is no hyphen, there can be at most seven 0-9 or A-Z characters.
I dont know how to do and "if statement" in a regex. Is that even possible?
Upvotes: 3
Views: 5818
Reputation: 4233
I use a or with two patterns 7 alpha numeric characters or 3 alpha numeric character a hyphen and 4 alpha numeric characters
def check_string(string):
if re.match(r'^[A-Z0-9]{7}$|^[A-Z0-9]{3}-[A-Z0-9]{4}$', string):
return True
else:
return False
Upvotes: 0
Reputation: 19457
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])
Upvotes: 4
Reputation: 49089
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.
Upvotes: 1
Reputation: 3526
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.
Upvotes: 5
Reputation: 1109
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...
Upvotes: 1