我正在尝试编写一个正则表达式来确定C中宏声明的名称是否为大写:
#define MY_MACRO
为了只检测大写单词(不考虑退格或连字符等特殊字符),我使用以下正则表达式:
"#define +[^A-Z]+"
如果我的宏是完整的大写但是失败,如果它是这样的话,它可以工作:
#define Mymacro
什么是正则表达式能够确定这种情况?
答案 0 :(得分:4)
要检测#define MixedCase
但不匹配#define ALLUPPERCASE
,您需要一个否定的先行断言:
r'#define\s+(?![A-Z_]+\b)[A-Za-z_]+\b'
\b
匹配单词边界;一个单词结束的地方,可能是因为它后面的空格,或者是行尾。
(?!..)
否定前瞻断言在允许匹配混合大小写字之前检查下一个单词不是否全部为大写。
请注意,我在匹配的字符类中也包含了_
下划线。
您可能希望在宏名称中包含数字,毕竟它们是合法的:
r'#define\s+(?![A-Z0-9_]+\b)\w+\b'
然后可以将第二个字符类简化为\w
,这与[A-Za-z0-9_]
相同。
答案 1 :(得分:0)
正则表达式是否有来做所有事情?您可以将所有#define
与正则表达式匹配,然后使用一些非常简单的Python代码测试宏名称的大写:
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