Matching a word as a group in regular expressions

Viewed 94

Input text:

## (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!

Pattern:

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

My main problem is with matching Nice to meet you as a group and not individual words like seen below:

Problem visual output

My initial solution was changing [a-zA-Z|!]* to [a-zA-Z|\s|!]* but it then captures all the space in the given trace text.

2 Answers

If you want another capture group, you can capture matching what is in the character class and repeat that 1+ times optionally followed by a space and again repeating the character class.

If you use [a-zA-Z!] you might possibly also match only multiple exclamation marks !!!

If you don't want to match that as a separate word, you can optionally match a single ! afterwards [a-zA-Z]+!? so you would only match words that could possibly end with an exclamation mark.

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

The updated part ([a-zA-Z]+!?(?: [a-zA-Z]*!?)*) matches:

  • ( Capture group 6 (group 6 in the whole pattern)
    • [a-zA-Z]+!? Match 1+ times a-zA-Z and optional !
    • (?:
      • [a-zA-Z]*!? Match a space, char a-zA-Z and optional !
    • )* Close non capture group and repeat 0+ times to match more words
  • ) Close capture group 6

Regex demo


Matching all chars in the character class, but not matching spaces only:

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

Regex demo

Consider doing something like this:

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

This merges the part of the regex capturing the ex. (CR 0) SM 3 and the part of the regex capturing the stuff following it by removing the | between them.

This means that it only captures the spaces if it is preceded by the (CR 0) SM 3 text.

Related