Попробуйте это:
(?:[^@]|^)@{3}(\s*[A-Z_]+\s*)@{3}(?!@)
// or with Java escaping
(?:[^@]|^)@{3}(\\s*[A-Z_]+\\s*)@{3}(?!@)
Помещение буквального пробела создает необходимый пробел.Так что a b
отличается от ab
.В исходном шаблоне у вас было пространство между \\s+ \w
.Также \w
соответствует строчным и прописным буквам.Использование класса символов приведет к совпадению только в верхнем регистре.
Если вы хотите избежать более трех (как предполагает один из комментариев), вам нужно добавить немного дополнительного кода.
В начале мы помещаем это, которое говорит, что соответствует либо не-символ, либо начало строки ^
.(?:)
означает, что мы не заботимся об этой части матча.
(?:[^@]|^)
В конце мы должны сказать, что следующий символ не может быть @.(?!)
означает сбой, если шаблон может соответствовать.Это не в конечном итоге захватывает его, потому что это нулевая ширина прогноз.
(?!@)
Я обновил шаблоны в верхней части.
Эти новые шаблоныбудет не соответствовать этим.
@@@ CAT_DOG @@@@
@@@@ CAT_DOG @@@