Мне нужно регулярное выражение, которое будет соответствовать любой строке, содержащей не более 2 тире и 2 точки. Там не должно быть ни черты, ни точки, но если есть 3+ тире или 3 точки или даже 3 + тире и 3+ точки, то регулярное выражение не должно совпадать с строкой.
Предназначен для использования в PHP.
Я знаю о простых альтернативах с использованием функций PHP, но он должен использоваться в большой системе, которая просто позволяет фильтровать с использованием регулярных выражений.
Пример строки, которая будет MATCHED:
hello-world.com
Пример строки, которая НЕ будет соответствовать:
www.hello-world.easy.com или hello-world-i-win.com
Это соответствует вашим ожиданиям?
(?!^.*?([.-]).*\1.*\1.*$)^.*$
См. Здесь, в Regexr
(?!^.*?([.-]).*\1.*\1.*$)
Является негативным взглядом. Он совпадает с первым .-
Поместите его в группу захвата 1, а затем проверьте, есть ли еще два из них, используя hte backreference \1
. Как только он найдет три, выражение больше не будет соответствовать.
^.*$
соответствует всем от начала до конца, если отрицательный lookahead не соответствует.
Это проверенное регулярное выражение будет делать трюк:
$re = '/# Match string with 2 or fewer dots or dashes ^ # Anchor to start of string. (?=[^.]*(?:\.[^.]*){0,2}$) # Assert 2 or fewer dots. (?=[^\-]*(?:-[^\-]*){0,2}$) # Assert 2 or fewer dashes. .* # Ok to match string. $ # Anchor to end of string. /sx';
Используйте это: (?!^.*?([-.])(?:.*\1){2}.*$)^.*$