我的问题是我有一个程序通过标准C文件(在这里我只是使用了文本文件)。我能够识别注释,但是无法识别字符串中的注释块。因此,例如:
printf("This should be counted as a comment: /* */");
但是它说,既然找到了/ * * /,那是真的。我正在使用的正则表达式模式
((['"])(?:(?!\2|\\).|\\.)*\2)|\/\/[^\n]*|\/\*(?:[^*]|\*(?!\/))*\*\/
只需使其包含双引号的字符串即可。
如果要删除注释,则可以使用正则表达式来匹配字符串和注释,并仅将注释替换为空字符串((Java 9 +):
] Pattern regex = Pattern.compile(
"(?s)((?<!\\\\)\".*?(?<!\\\\)\"|(?<!\\\\)'.*?(?<!\\\\)'|/\\*.*?\\*/)");
// Assuming 'text' is the file contents string
String textWithoutComments = regex.matcher(text).replaceAll(m -> {
char c = m.group().charAt(0);
return c == '\'' || c == '"' ? m.group() : "";
});
正则表达式在多行中查找双引号或单引号对(带有负向后缀以忽略转义符)或c样式注释。匹配替换项lambda函数如果带引号,则返回原始匹配项,否则返回空白字符串以替换注释。