I want a regex to have the following behaviour:
*test and test* -> match ok
* test and test* -> match NOT ok
*test and test * -> match NOT ok
* test and test * -> match NOT ok
I was using this regex to get it working: \*[^\s](.*?)[^\s]\*
But the problem is, in group #1, it cuts the first and last letter, so instead of having a match test and test, I end up with est and tes, I need to keep both first and last letter while also having whitespace in between the words
CodePudding user response:
That is because [^\s] actually matches a char, there are 2 of them so it matches (not captures) 2 characters.
The negated character class should be inside the capture group right after the asterix, and repeat it 1 or more times to not match an empty string.
If you want to exclude matching an asterix as well [^\s*] and match everything inside the * without leading or trailing spaces:
\*([^\s*] (?:\s [^\s*] )*)\*
The pattern in parts:
\*Match*(Capture group 1[^\s*]Match 1 times any chars other than a whitspace char or*(?:\s [^\s*] )*Optionally repeat 1 whitespace and again the first character class
)Close group 1\*Match*
CodePudding user response:
You just don't have the first and last letter inside your capture group (denoted by the parenthesis).
Try this: \*([^\s].*?[^\s])\*
