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

时间:2011-06-25 13:57:09

标签: regex qt internationalization qt-creator

我想在现有的应用程序中介绍i18n。作为第一步,我需要用tr("something")替换字符串文字。

我创建了以下正则表达式来提取字符串:

(?<!#include)"([^"\\]|\\.)*"

然而,这不起作用。没有负面的lookbehind,它确实匹配字符串,但引用包括我想避免的。我不太熟悉负面的外观,我只是查了一下here

示例:

#include "hello.h"                           // should NOT match "\"hello.h\""
printf("Hello");                             // should match "\"Hello\""
cout << "hello" << "hello" << "hello";       // should match each three "\"hello\""'s

我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分:1)

请尝试这个

(?<!#include\s)"(?:\\\"|[^"\n])*?"

它直接工作(没有组)。它还支持字符串中的转义引号。这里唯一的约束是 #include和文件名之间的一个空格。这是因为QTcreator不支持负面观察的量词。

我试着解决它。但不确定生病是否成功。

答案 1 :(得分:0)

您可以使用:

(?!^#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());

答案 2 :(得分:0)

好的,这是我的解决方案(有点):

首先,我无法在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

正则表达式是带有\ v的vim-regex,它使得更自然(更少逃逸)。简而言之,它使用了我最初想要的负面观察,语法略有不同。

现在,我只需要为打开的多个缓冲区(在命令模式下)运行此宏:

78@a

问题(这就是为什么它只是一种“解决方案”)是每当vim遇到正则表达式失败的缓冲区(即文件中没有字符串文字)时,它就会停止重复宏。我无法找到解决方法。幸运的是我只有几个这样的文件,所以我可以通过手动重新运行上面的命令来重新开始重复宏。