Emacs正则表达式问题:如何正确匹配CamelCase驼峰式单词?
嘿,我来帮你分析下问题出在哪~
你的正则表达式\([A-Z]*\)\.[a-zA-Z0-9_-]*[(]里,[A-Z]*的问题在于***允许匹配零个大写字母**——也就是说,当遇到helloWorld.hello(这种以小写开头的字符串时,[A-Z]*会匹配「空字符串」,然后正则就会继续匹配后面的.hello(,自然就把整个非驼峰的内容也高亮了。
要匹配真正的CamelCase驼峰式单词,你需要确保这个单词至少以一个大写字母开头,并且后面跟着大小写混合的字母(符合驼峰的结构)。这里给你两个修正方向:
基础版:确保以大写开头(允许全大写单词)
把[A-Z]*改成[A-Z][a-zA-Z]*,修正后的正则:
\([A-Z][a-zA-Z]*\)\.[a-zA-Z0-9_-]*[(]
[A-Z]:强制要求单词以大写字母开头,直接排除了小写开头的情况;[a-zA-Z]*:后面可以跟任意数量的大小写字母,覆盖了HelloWorld、HELLOWORLD这类结构。
严格版:确保是「大小写交替」的驼峰(排除全大写单词)
如果你想更严格,只匹配真正的驼峰(比如HelloWorld,而不是全大写的HELLOWORLD),可以调整为:
\([A-Z][a-z]+[a-zA-Z]*\)\.[a-zA-Z0-9_-]*[(]
[A-Z][a-z]+:要求大写开头后至少跟一个小写字母,保证存在大小写交替的驼峰特征;- 后面的
[a-zA-Z]*则允许后续继续出现大小写混合的字母。
这样调整后,HelloWorld.hello(会被正确匹配,而helloWorld.hello(因为开头是小写,正则的第一部分无法匹配,就不会被高亮啦~
内容的提问来源于stack exchange,提问作者Jen-Chieh Shen
相关产品推荐
相关产品推荐

