Если вам нужна другая группа захвата, вы можете захватить соответствие того, что находится в классе символов, и повторить это 1+ раз, необязательно с последующим пробелом и снова повторяя класс символа.
Если вы используете [a-zA-Z!]
вы также можете сопоставить только несколько восклицательных знаков !!!
Если вы не хотите сопоставлять это как отдельное слово, вы можете при желании сопоставить один !
после [a-zA-Z]+!?
, чтобы вы могли сопоставить только слова, которые могут оканчиваться восклицательным знаком.
(##[^\n]*\n)|(\((CR|CL) \d+\)) ((RM|SM) [0-9]:)|([a-zA-Z]+!?(?: [a-zA-Z]*!?)*)
Обновленная часть ([a-zA-Z]+!?(?: [a-zA-Z]*!?)*)
соответствует:
(
Capture group 6 (group 6 во всем шаблоне) [a-zA-Z]+!?
Соответствует 1+ раз a-zA-Z и необязательно !
(?:
[a-zA-Z]*!?
Соответствует пробелу , char a-zA-Z и необязательный !
)*
Закройте группу без захвата и повторите 0+ раз, чтобы сопоставить больше слов
)
Закрыть группу захвата 6
Regex demo
Matchi ng все символы в классе символов, но не только соответствующие пробелы:
(##[^\n]*\n)|(\((CR|CL) \d+\)) ((RM|SM) [0-9]:)|([a-zA-Z!]+(?: [a-zA-Z!]*)*)
Regex demo