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/i
flag)(?:[-.][a-z0-9] )*
- zero or more occurrences of-
or.
and then one or more letters/digits$
- end of string.