我尝试"[A-Z][A-Z0-9_]*(_[A-Z0-9]+)+"
来查找由'_'链式数字部分组成的标识符,标识符以字母开头,并且不包含小写字母,例如“ ID_RED”,“ NO_ENTRY_PERMITTED”,“ THIS_IS4YOU_ALL”。我不想听到“ THINKING__NO”或“ 4YOU_AND_ME”。
错误似乎出在第二部分"(_[A-Z0-9]+)+"
;至少不像预期的那样贪婪,但是会产生_RED,_ENTRY,_IS4YOU
问题出在[A-Z0-9_]*
部分可以匹配0个或多个连续的_
字符。您的模式无论如何都不是锚定的,因此它也可以用较长的单词找到部分匹配项。
您可以使用
\b[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+\b
请参见regex demo
详细信息:
\b
-单词边界[A-Z]
-大写字母[A-Z0-9]*
-0+大写字母或数字(?:_[A-Z0-9]+)+
-出现1次或多次_
,然后再出现1+个大写字母或数字\b
-单词边界