I need a regex that matches strings with any non-whitespace characters, where only a maximum of 3 consecutive uppercase letters are allowed. I'm not experienced enough to find that out on my own.
A list of example strings that should match:
a
aa
aaa
aaaa
A
aA
Aa
AA
aAA
AAa
aAAa
aaAAaa
AAaAAa
AaAaA
Strings that must not match:
AAA
aAAA
AAAa
aAAAa
aaaAAaAAA
a and A stands for any characters that are part of normal words (not , or or something like that).
As interesting as it is, it is to tricky for me. I even don't know how to start.
Update: @zerOOne pointed me to this answer.
/\b\p{L}*\p{Lu}{3}\p{L}*\b/u
seems to be exactly the opposite of what I want. Tried to negate that with
/(?!\b\p{L}*\p{Lu}{3}\p{L}*\b)/u
But that doesn't work. How could I else negate the regex?
CodePudding user response:
If it's a string with non-whitespace and max 2 consecutive uppercase letters, then this regex will do :
^(?!.*\p{Lu}{3})\S $
^: start of line or string
(?!.*\p{Lu}{3}): negative lookahead to skip strings with at least 3 consecutive uppercase letters
\S: one or more non-whitespace characters
$: end of line or string
To only match strings that only contain letters simply replace the \S by \p{L}
\p{L}: any kind of letter from any language.
^(?!.*\p{Lu}{3})\p{L} $
CodePudding user response:
Two solutions seems to be possible.
Taken from the comments above (credits to @WiktorStribiżew):
^(?!.*\b\p{L}*\p{Lu}{3}\p{L}*\b).*
Found that on my own (and not 100% sure about that - but it seems to do it):
^((?!\p{Lu}{3})\p{L})*$
People told me that this is a duplicate question. I leave the answer here for anyone, though. No need to upvote.
