Совпадение слова как группы в регулярных выражениях - PullRequest
2 голосов
/ 14 июля 2020

Введите текст:

## (Chat room 1) Received message from client 1: Nice to meet you!
(CR 1) RM 1: Nice to meet you!
(CR 1) SM 1: Nice to meet you!
## (Client 1) Received message from client 1: Nice to meet you!
(CL 1) RM 1: Nice to meet you!
(CR 0) SM 3: Nice to meet you!
## (Client 3) Received message from client 3: Nice to meet you!
(CL 3) RM 3: Nice to meet you!

Шаблон:

(##[^\n]*\n)|(\((CR|CL) \d+\)) ((RM|SM) [0-9]:)|[a-zA-Z|!]*

Моя основная проблема заключается в сопоставлении. Приятно познакомиться с вами как группа, а не отдельные слова, как показано ниже:

Проблема с визуальным выводом

Мое первоначальное решение меняло [a-zA-Z|!]* на [a-zA-Z|\s|!]*, но затем оно захватывает все пространство в заданном тексте трассировки.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Если вам нужна другая группа захвата, вы можете захватить соответствие того, что находится в классе символов, и повторить это 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

1 голос
/ 14 июля 2020

Попробуйте сделать что-то вроде этого:

(##[^\n]*\n)|(\((CR|CL) \d+\)) ((RM|SM) [0-9]:)([a-zA-Z!\s]*)

Это объединяет часть регулярного выражения, захватывающую ex. (CR 0) SM 3 и часть регулярного выражения, захватывающая следующий за ним материал путем удаления | между ними.

Это означает, что он захватывает только пробелы, если ему предшествует текст (CR 0) SM 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...