RegExp for Phone Number - javascript

I am trying to use RegExp() to accept the following inputs:
1234567890
12 34 56 78 90
12-34-56-78-90
12.34.56.78.90
12 34.56-7890
What I have been trying to use is:
([0-9]{2,2}[ |-|.]?){4,4}[0-9]{2,2}
Which I understand as: (digit 2 times, followed by space or - or . or nothing) 4 times, then digit 2 times.
I have been testing [0-9]{2,2} which doesn't even behave as I expected since it accepts at least 2 digits, and not exactly 2 digits.

This one should suit your needs (last case not matched as expected):
^\d{2}([ .-]?)\d{2}(?:\1\d{2}){3}$
Demo

var mob=/^([0-9]{2}(\s|\.|\-)){4}[0-9]{2}$/;
console.log(mob.test("12.34.56.78.90"));
console.log(mob.test("12-34-56-78-90"));
console.log(mob.test("12 34 56 78 90"));
var mob=/^([0-9]{2}(\s|\.|\-)?){4}[0-9]{2}$/;
console.log(mob.test("1234567890"));
console.log(mob.test("12 34 56 78 90"));

Related

HTML pattern for input that allows only numbers with maximum of 1 dot or (1 or 2 spaces)

I am trying to create pattern in angular for input to allow only numbers with 1 dot or (1 or 2 spaces) i.e. it should allow
Decimal Degrees like 45 or 34.1234 or -91.5
Degrees Minutes like 12 13
Degrees Minutes Seconds like 12 13 5
<input type="text" required pattern="/^[\d](\.| )?[\d]( )?[\d]">
I am looking for pattern in above code.
Thanks in advance.
as per the documentation for the HTML pattern-attribute
you shouldn't use the usual JavaScript/PHP/etc.
/^$/ delimiters
as pattern assumes
^(?: at the beginning and )$ at the end
ie.
pattern="[a-z]"
will accept all inputs containing only lowercase a-z characters
so here's a full pattern regexp that will do what you ask
pattern="(-)?\d{1,}|(-)?\d{1,}(\.)\d{1,}|(-)?\d{1,}(\s)(-)?\d{1,}|(-)?\d{1,}(\s)(-)?\d{1,}(\s)(-)?\d{1,}"
explanation:
(-)? optional negative sign
\d{1,} matches any number (ie. 3 or 235 but not 3.7)
| or
\d{1,} matches any number
(\.)\d{1,} followed by a single period followed by a number (ie. 4.34 or 5.98 but not 3.1.4 or 43..2)
| or
\d{1,} matches any number
(\s)\d{1,} followed by a single space followed by a number (ie. 3 5 or 654 34 but not 3 1 4 or 43 2)
| or
\d{1,} matches any number
(\s)\d{1,} followed by a single space followed by a number
(\s)\d{1,} followed by a single space followed by a number (ie. 5 2 65 or 543 23 1 but not 23 32 45 654 or 876 65 34)
// (-)? optional negative sign
// {1,} values can be more than 1 character (required or it will only accept single digits ie. 3 or 5.6 or 7 5 or 8 4 6 but not 43 or 23.46 or 12 76 or 35 65 78)
<form>
<label for="numbers">number or number with decimals or 2-3 numbers seperated by 1 space</label>
<input id="numbers" name="numbers" required pattern="(-)?\d{1,}|(-)?\d{1,}(\.)\d{1,}|(-)?\d{1,}(\s)(-)?\d{1,}|(-)?\d{1,}(\s)(-)?\d{1,}(\s)(-)?\d{1,}">
<button>Submit</button>
</form>

Regex with decimal number that must be specific number

I need a regex for numbers like those
+2.25
-9,75
+02,50
-10.00
What I have done so far is this ^([-+]\d{2}[.,][00|25|50|75]{1,2})$
1- [-+] = obligatory at the beginning
2- \d{2} = any number between 0 and 99
3- [.,] = separator can be .or,
4- [00|25|50|75]{1,2} = input must be 00 or 25 or 50 or 75
The number 4- is not working as you can test here https://regex101.com/.
What I want and what I don't want as results
-9.75 Good
-9.77 Bad
the end must always be 00 or 25 or 50 or 75
You need to accept 1 or 2 numbers first.
^[-+]\d{1,2}[.,](00|25|50|75)$
the only modification to your regex: \d{1,2}, it accepts one or two digits.
Another option:
^[-+]\d?\d[.,](00|25|50|75)$
\d?\d makes the first digit optional.
You can test it here and here

Regex to select all characters that do not match a pattern

I'm weak with regexes but have put together the following regex which selects when my pattern is met, the problem is that i need to select any characters that do not fit the pattern.
/^\d{1,2}[ ]\d{1,2}[ ]\d{1,2}[ ][AB]/i
Correct pattern is:
## ## ## A|B aka [0 < x <= 90]*space*[0 < x <= 90] [0 < x <= 90] [A|B]
EG:
12 34 56 A → good
12 34 56 B → good
12 34 5.6 A → bad - select .
12 34 5.6 C → bad - select . and C
1A 23 45 6 → bad - select A and 6
Edit:
As my impression was that regex is used to perform validation of both characters and pattern/sequence at the same time. The simple question is how to select characters that do not fit the category of non negative numbers, spaces and distinct characters.
Answer 1
Brief
This isn't really realizable with 1 regex due to the nature of the regex. This answer provides a regex that will capture the last incorrect entry. For multiple incorrect entries, a loop must be used. You can correct the incorrect entries by running some code logic on the resulting captured groups to determine why it isn't valid.
My ultimate suggestion would be to split the string by a known delimiter (in this case the space character and then using some logic (or even a small regex) to determine why it's incorrect and how to fix it, as seen in Answer 2.
Non-matches
The following logic is applied in my second answer.
For any users wondering what I did to catch incorrect matches: At the most basic level, all this regex is doing is adding |(.*) to every subsection of the regex. Some sections required additional changes for catching specific invalid string formats, but the |(.*) or slight modifications of this will likely solve anyone else's issues.
Other modifications include:
Using opposite tokens
For example: Matching a digit
Original regex: \d
Opposite regex \D
For example: Matching a digit or whitepace
Original regex: [\d\s]
Opposite regex: [^\d\s]
Note [\D\S] is incorrect as it matches both sets of characters, thus, any non-whitespace or non-digit character (since non-whitespace includes digits and non-digits include whitespace, both will be matched)
Negative lookaheads
For example: Catching up to 31 days in a month
Original regex \b(?:[0-2]?\d|3[01])\b
Opposite regex: \b(?![0-2]?\d\b|3[01]\b)\d+\b
Code
First, creating a more correct regex that also ensures 0 < x <= 90 as per the OP's question.
^(?:(?:[0-8]?\d|90) ){3}[AB]$
See regex in use here
^(?:(?:(?:[0-8]?\d|90) |(\S*) ?)){3}(?:[AB]|(.*))$
Note: This regex uses the mi flags (multiline - assuming input is in that format, and case-insensitive)
Other Formats
Realistically, this following regex would be ideal. Unfortunately, JavaScript doesn't support some of the tokens used in the regex, but I feel it may be useful to the OP or other users that see this question.
See regex in use here
^(?:(?:(?:[0-8]?\d|90) |(?<n>\S*?) |(?<n>\S*?) ?)){3}(?:(?<n>\S*) )?(?:[AB]|(.*))$
Results
Input
The first section (sections separated by the extra newline/break) shows valid strings, while the second shows invalid strings.
0 45 90 A
0 45 90 B
-1 45 90 A
0 45 91 A
12 34 5.6 A
12 34 56 C
1A 23 45 6
11 1A 12 12 A
12 12 A
12 12 A
Output
0 45 90 A VALID
0 45 90 B VALID
-1 45 90 A INVALID: -1
0 45 91 A INVALID: 91
12 34 5.6 A INVALID: 5.6
12 34 56 C INVALID: C
1A 23 45 6 INVALID: 1A, 6
11 1A 12 12 A INVALID: 12 A
12 12 A INVALID: (missing value)
12 12 A INVALID: A, (missing value)
Note: The last entry shows an odd output, but that's due to a limitation with JavaScript's regex engine. The Other Formats section describes this and another method to use to properly catch these cases (using a different regex engine)
Explanation
This uses a simple | (OR) and captures the incorrect matches into a capture group.
^ Assert position at the start of the line
(?:(?:(?:[0-8]?\d|90) |(\S*) ?)){3} Match the following exactly 3 times
(?:(?:[0-8]?\d|90) |(.+)) Match either of the following
(?:[0-8]?\d|90) Match either of the following, followed by a space character literally
[0-8]?\d Match between zero and one of the characters in the set 0-8 (a digit between 0 and 8), followed by any digit
90 Match 90 literally
(\S*) ? Capture any non-whitespace character one or more times into capture group 1, followed by zero or one space character literally
(?:[AB]|(.*)) Match either of the following
[AB] Match any character present in the set (A or B)
(.*) Capture any character any number of times into capture group 2
$ Assert position at the end of the line
Answer 2
Brief
This method splits the string on the given delimiter and tests each section for the proper set of characters. It outputs a message if the value is incorrect. You would likely replace the console outputs with whatever logic you want use.
Code
var arr = [
"0 45 90 A",
"0 45 90 B",
"-1 45 90 A",
"0 45 91 A",
"12 34 5.6 A",
"12 34 56 C",
"1A 23 45 6",
"11 1A 12 12 A",
"12 12 A",
"12 12 A"
];
arr.forEach(function(e) {
var s = e.split(" ");
var l = s.pop();
var numElements = 3;
var maxNum = 90;
var syntaxErrors = [];
if(s.length != numElements) {
syntaxErrors.push(`Invalid number of elements: Number = ${numElements}, Given = ${s.length}`);
}
s.forEach(function(v) {
if(v.match(/\D/)) {
syntaxErrors.push(`Invalid value "${v}" exists`);
} else if(!v.length) {
syntaxErrors.push(`An empty value or double space exists`);
} else if(Number(v) > maxNum) {
syntaxErrors.push(`Value greater than ${maxNum} exists: ${v}`);
}
});
if(l.match(/[^AB]/)) {
syntaxErrors.push(`Last element ${l} in "${e}" is invalid`);
}
if(syntaxErrors.length) {
console.log(`"${e}" [\n\t${syntaxErrors.join('\n\t')}\n]`);
} else {
console.log(`No errors found in "${e}"`);
}
});

Translate regular expression

I would like to translate this JS regular expression
^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$
to use in grep. All phone numbers bellow match it:
+79261234567
89261234567
79261234567
+7 926 123 45 67
8(926)123-45-67
123-45-67
9261234567
79261234567
(495)1234567
(495) 123 45 67
89261234567
8-926-123-45-67
8 927 1234 234
8 927 12 12 888
8 927 12 555 12
8 927 123 8 123
I've tried a lot of variants but no one works for me.
I haven't tested your pattern, although a few things to consider are:
[\- ] should instead be [- ] or [ -]
(in a character class [] escaping dash is unnecessary if it's first
or last).
[\d] will probably fail so either use [0-9] or [:digit:]
So this leaves you with:
grep -E "^((8|\+7)[ -]?)?(\(?[0-9]{3}\)?[ -]?)?[0-9 -]{7,10}$" file
or egrep:
egrep "^((8|\+7)[ -]?)?(\(?[0-9]{3}\)?[ -]?)?[0-9 -]{7,10}$" file

Regular Expression Phone Number Validation

I wrote this regular expression for the Lebanese phone number basically it should start with
00961 or +961 which is the international code then the area code which
could be either any digit from 0 to 9 or cellular code "70" or "76" or
"79" then a 6 digit number exactly
I have coded the following reg ex without the 6 digit part :
^(([0][0]|[+])([9][6][1])([0-9]{1}|[7][0]|[7][1]|[7][6]|[7][8]))$
when i want to add code to ensure only 6 digits more are allowed to the expression:
^(([0][0]|[+])([9][6][1])([0-9]{1}|[7][0]|[7][1]|[7][6]|[7][8])([0-9]{6}))$
It Seems to accept 5 or 6 digits not 6 digits exactly
i am having difficulty finding whats wrong
use this regex ((00)|(\+))961((\d)|(7[0168]))\d{6}
Ths is what I would use.
/^(00|\+)961(\d|7[069])\d{6}$/
00 or +
961
a 1-digit number or 70 or 76 or 79
a 6-digit number
The [0-9]{1} will match also the cellular codes 7x since 7 is between 0 and 9. This means that a "5 digit cellular number" will match on a 7 and six more digits.
Try
/^(00961|\+961)([0-9]|70|76|79)\d{6}$/.test( phonenumber );
//^ start of string
// ^^^^^^^^^^^^^ 00961 or +0961
// ^^^^^^^^^^^^^^^^ a digit 0 to 9 or 70 or 76 or 79
// ^^^^^ 6 digits
// ^ end of string
The cellar code is forming a trap, as #ellak points out:
/^((00)|(\+))961((\d)|(7[0168]))\d{6}$/.test("009617612345"); // true
Here the code should breaks like this: 00 961 76 12345,
but the RegEx practically breaks it like this: 00 961 7 612345, because 7 is matched in \d, and the rest is combined, exactly in 6 digits, and matched.
I'm not sure if this is actually valid, but I guess this is not what you want, otherwise the RegEx in your question should work.
Here's a kinda long RegEx that avoids the trap:
/^(00|\+)961([0-68-9]\d{6}|7[234579]\d{5}|7[0168]\d{6})$/
A few test result:
/(00|\+)961([0-68-9]\d{6}|7[234579]\d{5}|7[0168]\d{6})/.test("009617012345")
false
/(00|\+)961([0-68-9]\d{6}|7[234579]\d{5}|7[0168]\d{6})/.test("009618012345")
true
/(00|\+)961([0-68-9]\d{6}|7[234579]\d{5}|7[0168]\d{6})/.test("009617612345")
false
/(00|\+)961([0-68-9]\d{6}|7[234579]\d{5}|7[0168]\d{6})/.test("0096176123456")
true
Just recently, the Lebanese Ministry of Telecommunication has changed area codes on the IMS. So the current Regex matcher becomes:
^(00|\+)961[ -]?(2[1245789]|7[0168]|8[16]|\d)[ -]?\d{6}$
Prefix: 00 OR +
Country code: 961
Area code: 1-digit or 2-digits; including 2*, 7*, 8*..., OR a single digit for Ogero numbers on the old IMS network starting with 0*, and finally older mobile lines starting with 03.
The 6-digit number
News on the961.com

Categories

Resources