Я предположил, что «пробел» - это пробел, и не выполнил требование №7, потому что не понимаю, что оно означает. После прояснения пункта 7 я попытаюсь изменить следующее регулярное выражение.
^(?!#|.*[^ ]#)(?!.*(?: -|- ))(?!.*(?:\D\/|\/\D))(?!.*\d[A-Za-z]{3})(?![/-])[a-zA-Z0-9- /.#,]*(?<![#/-])$
Запустите свой движок!
Обратите внимание, что регулярное выражение содержит 5 отрицательный просмотр назад ((?!...)
), три из которых начинаются с использования нуля или более символов, кроме символов конца строки ((?!.*...)
), и один отрицательный просмотр назад в конце ((?<![#/-])
и нет группы захвата. Отрицательные опережающие просмотры реализуют следующие утверждения (по порядку):
- знак фунта '#' должен предшествовать запятой;
- перед дефисом не может быть или после пробела; перед
- перед косой чертой должна стоять цифра; и за
- цифрами не может следовать 3 буквы.
- строка не может начинаться с '/' или '-'
Обратите внимание, что первое из этих требований гарантирует, что строка не начинается со знака фунта.
Javascript Механизм регулярных выражений выполняет следующие операции.
^ : match beginning of string
(?! : begin negative lookahead
# : match '#'
| : or
.*[^ ]# : match 0+ chars then char other than a space then '#'
) : end negative lookahead
(?! : begin negative lookahead
.* : match 0+ chars other than newlines
(?: -|- ) : match ' -' or '- '
) : end negative lookahead
(?! : begin negative lookahead
.* : match 0+ chars other than newlines
(?: : begin a non-capture group
\D\/ : match a non-digit followed by '/'
| : or
\/\D : match '/' followed by a non-digit
) : end non-capture group
) : end negative lookahead
(?! : begin negative lookahead
.* : match 0+ chars other than newlines
\d[A-Za-z]{3} : match a digit, then 3 letters
) : end negative lookahead
(?! : begin negative lookahead
[/-] : match '/' or '-'
) : end negative lookahead
[a-zA-Z0-9- /.#,]* : match 0+ chars in char class
(?<![#/-]) : match '#', '/' or '-' in negative lookbehind
$ : match end of string