使用正则表达式在C ++源代码中查找字符串文字,但不包括?

| 我想在现有应用程序中介绍i18n。第一步,我需要将字符串文字替换为“ 0”。 我创建了以下正则表达式来提取字符串:
(?<!#include)\"([^\"\\\\]|\\\\.)*\"
但是,这不起作用。没有否定的后顾之忧,它确实可以正确匹配字符串,但是还引用了我想避免的包含在内。我对负面的回望不是很熟悉,我只是在这里抬头。 例:
#include \"hello.h\"                           // should NOT match \"\\\"hello.h\\\"\"
printf(\"Hello\");                             // should match \"\\\"Hello\\\"\"
cout << \"hello\" << \"hello\" << \"hello\";       // should match each three \"\\\"hello\\\"\"\'s
如何正确执行此操作?     
已邀请:
        请试试这个
(?<!#include\\s)\"(?:\\\\\\\"|[^\"\\n])*?\"
它可以直接工作(无组)。它还支持字符串中的转义引号。这里唯一的约束是#include和文件名之间的一个空格。这是因为QTcreator不支持负向后面的量词。 虐待尝试修复它。但不确定病态能否成功。     
        您可以使用:
(?!^#include).*?(\\\"[^\\\"]+?\\\").*?
引号中的字符串由组捕获。 在Java中:
    String s = \"(?!^#include).*?(\\\"[^\\\"]+?\\\").*?\";
    Pattern p = Pattern.compile(s);

    System.out.println(p.matcher(\"#include \\\"hello.h\\\" \").matches());
    System.out.println(p.matcher(\"printf(\\\"Hello\\\"); \").matches());
    System.out.println(p.matcher(\"cout << \\\"hello\\\" << \\\"hello\\\" << \\\"hello\\\"; \").matches());
    
        好的,这是我的解决方案(有点): 首先,我无法在Qt Creator中做到这一点,目前它的正则表达式功能似乎还不够好。所以我用了vim。 我打开了所有受影响的文件作为vim缓冲区,然后记录了以下宏:
qa:%s/\\v(#include\\s+)@<!\"([^\"]*)\"/tr(\\0)/g<CR>:bn<CR>q
这将执行以下操作:
qa                                       // start recording into register \"a\"
%s/\\v(#include\\s+)@<!\"([^\"]*)\"/tr(\\0)/g  // search and replace as specified
<CR>                                     // (hit enter)
:bn                                      // jump to the next buffer
<CR>                                     // (hit enter)
q                                        // end recording macro
regex是带有\\ v的vim-regex,使其更自然(转义更少)。简而言之,它使用了我最初想要的否定性后缀,语法略有不同。 现在,我只需要为打开的缓冲区(在命令模式下)运行此宏即可:
78@a
问题(这就是为什么它只是一个“解决方案”的原因)是,每当vim遇到正则表达式失败的缓冲区(即文件中没有字符串文字)时,它都会停止重复宏。我找不到解决方法。幸运的是,我只有几个这样的文件,因此可以手动重新运行上述命令以再次开始重复该宏,从而摆脱困境。     

要回复问题请先登录注册