2024-04-23 06:40:51 发布
网友
我试图编写一个正则表达式来确定C中宏声明的名称是否大写:
#define MY_MACRO
为了只检测大写单词(不考虑空格或连字符等特殊字符),我使用以下正则表达式:
如果我的宏是全大写的,它会起作用,但如果它是这样的,则会失败:
#define Mymacro
什么是正则表达式可以确定这种情况?在
正则表达式是否有来执行所有操作?您只需将所有#define与regex匹配,然后使用一些非常简单的Python代码测试宏名称的大写:
#define
macro_defn = re.compile(r'#define\s+(\w+)') for line in code_source: macro_match = macro_defn.match(line) if macro_match: macro_name = macro.group(1) if macro_name.upper() != macro_name: print line
要检测#define MixedCase但不匹配#define ALLUPPERCASE,您需要一个否定的前瞻断言:
#define MixedCase
#define ALLUPPERCASE
r'#define\s+(?![A-Z_]+\b)[A-Za-z_]+\b'
\b与单词边界相匹配;一个单词结束的地方,可能是因为它后面有空格,或者是行尾。在
\b
(?!..)否定的lookahead断言检查下一个单词是否全部大写,然后允许对混合大小写单词进行匹配。在
(?!..)
请注意,我在匹配字符类中也包含了_下划线。在
_
您可能需要在宏名称中包含数字,毕竟它们是合法的:
第二个字符类可以简化为\w,这与[A-Za-z0-9_]相同。在
\w
[A-Za-z0-9_]
正则表达式是否有来执行所有操作?您只需将所有
#define
与regex匹配,然后使用一些非常简单的Python代码测试宏名称的大写:要检测
#define MixedCase
但不匹配#define ALLUPPERCASE
,您需要一个否定的前瞻断言:\b
与单词边界相匹配;一个单词结束的地方,可能是因为它后面有空格,或者是行尾。在(?!..)
否定的lookahead断言检查下一个单词是否全部大写,然后允许对混合大小写单词进行匹配。在请注意,我在匹配字符类中也包含了
_
下划线。在您可能需要在宏名称中包含数字,毕竟它们是合法的:
^{pr2}$第二个字符类可以简化为
\w
,这与[A-Za-z0-9_]
相同。在相关问题 更多 >
编程相关推荐