I was able to get only so far with my regex. Basically, it failed at the mismatched parens, and I have been unable to figure out how to prevent this problem using regex.
To satisfy the terms of the project, I kind of cheated by checking if parens exist and that there are not an odd amount of parens (i.e., mismatched).
I would like to know how to do this the correct way.
Any help would be highly appreciated.
**Your code so far**
function telephoneCheck(str) {
let regex = /^[1]?[-\s]?\(?(\d{3})\)?[-\s]?(\d{3})[-\s]?(\d{4})$/;
//begin a bit of a cheat to see if there is an odd number of parens present
let regParens = /[\(\)]/g;
let parens;
parens = str.match(regParens);
if (parens != null && parens.length%2 != 0) {
return false
}
//end a bit of a cheat to see if there is an odd number of parens present
return regex.test(str);
}//telephoneCheck(str)
**Your browser information:**
User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Not sure if FCC has introduced this to you or not but there is an OR operator for regular expressions (the pipe |) that allows you to match one thing OR another. I think you may find this handy for solving this challenge.
P.S. Your expression is a little busy. You don’t need the parens around things such as (\d{4}) because you are not trying to capture them.
I’m not sure what you mean by cheating but there are many ways to solve this problem…
I kept it simple and used regex to only test if there was a parenthesis in the string. If so, then we know that there are only two possible formats which are valid:
(555)555-5555
1(555)555-5555 // this isn’t listed as an example but there is a test case for it
You can then use basic array indices to check the position of the parenthesis.
Note: data needs to be cleaned and transformed before this step.
I’ll challenge you to make it even simpler This challenge can be solved with a single return statement and a fairly simple regular expression. I think this is what @josephlevin is looking for.
Yes, I was looking for one single regex to use. I tried using the OR, but without success.
I know that within the two slashes the OR works with whole phrases, like /dog|cat/, but I couldn’t get it to work for something like:
[(d{3}(|d{3}]
I ended up using the extra capture parens as without them nothing would match after the first few characters (such as 1, 1-, 1 with a space).
jjplant’s method of checking for the proper position of parens in the telephone number , post sanitizing, sounds like a good idea if the regex doesn’t work. It is more robust than my “cheating” solution of just checking for mismatched parens.
I revisited the task and figured it out without having to resort to a non-regex type of test.
let regex = /^[1]?[-\s]?(\d{3}|\(\d{3}\))[-\s]?(\d{3})[-\s]?(\d{4})$/;
/*
explanation:
^[1]? -> at the beginning of the string (via use of ^), zero or one number 1, followed by
[-\s]? -> zero or one dash or space, followed by
(\d{3}|\(\d{3}\)) -> 3 digits OR 3 digits surrounded by parens, like so: 111 OR (111), followed by
[-\s]? -> zero or one dash or space, followed by
(\d{3}) -> 3 digits, followed by
[-\s]? -> zero or one dash or space, followed by
(\d{4})$ -> 4 digits at the end of the string (via use of $)
^/
*/
The problem I think I was facing was a combination of not keeping my groupings straight with parens, as well as sometimes forgetting to put the \ in front of the d{3} while getting a bit muddled.
I’m posting the solution here as the FCC tutorials do not go into this in enough depth, IMO, and a part-by-part explanation can be really helpful.