This is the RegEx.
/^[a-zA-Z] (?!.*?\.\.)(?!.*?\-\-)[a-zA-Z0-9.-]*(?<!\.)(?<!\-)$/
It works with Chrome and Firefox browsers but fails on Safari browser with the error:
Invalid regular expression:invalid group specifier name
CodePudding user response:
First thing, you should understand what your regex pattern does (or matches).
^- start of string[a-zA-Z]- one or more letters(?!.*?\.\.)- no two consecutive dots allowed after any zero or more chars other than line break chars as few as possible(?!.*?\-\-)- no two consecutive dots allowed after any zero or more chars other than line break chars as few as possible[a-zA-Z0-9.-]*- zero or more letters, digits,.or-(?<!\.)(?<!\-)$- the end of string with no.nor-immediately on the left.
So, what you want to match is a string that starts with letters, then contains alphanumeric chars "interleaved" with dots or hyphens, but -- and .. are forbidden.
The identical pattern without a lookbehind will look like
/^[a-zA-Z](?!.*?\.\.)(?!.*?--)(?!.*[.-]$)[a-zA-Z0-9.-]*$/
Here, (?!.*[.-]$) requires to fail the match if there is a . or -at the end of the string. You should also emove the first `, it will allow backtracking when it is not necessary.
NOTE that the pattern above allows .- and -. in the string. If you do not want to allow that, simply use a no-lookaround pattern,
/^[a-z] (?:[-.][a-z0-9] )*$/i
The ^[a-z] (?:[-.][a-z0-9] )*$ pattern matches
^- start of string[a-z]- one or more letters (case insensitive matching is enabled with/iflag)(?:[-.][a-z0-9] )*- zero or more occurrences of-or.and then one or more letters/digits$- end of string.
