正则表达式:如何搜索不包含 2 个连续下划线的标识符 \w
Regex: How to search for identifiers \w that do not contain 2 consecutive underscores
我尝试 "[A-Z][A-Z0-9_]*(_[A-Z0-9]+)+"
以查找由“_”链接的 alnum 组件组成的标识符,以字母开头且不包含小写字母,例如"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
详情:
\b
- 单词边界
[A-Z]
- 大写字母
[A-Z0-9]*
- 0+个大写字母或数字
(?:_[A-Z0-9]+)+
- _
出现 1 次或多次,然后是 1+ 个大写字母或数字
\b
- 单词边界
我尝试 "[A-Z][A-Z0-9_]*(_[A-Z0-9]+)+"
以查找由“_”链接的 alnum 组件组成的标识符,以字母开头且不包含小写字母,例如"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
详情:
\b
- 单词边界[A-Z]
- 大写字母[A-Z0-9]*
- 0+个大写字母或数字(?:_[A-Z0-9]+)+
-_
出现 1 次或多次,然后是 1+ 个大写字母或数字\b
- 单词边界