我想在现有的应用程序中介绍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
我该如何正确地做到这一点?
答案 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遇到正则表达式失败的缓冲区(即文件中没有字符串文字)时,它就会停止重复宏。我无法找到解决方法。幸运的是我只有几个这样的文件,所以我可以通过手动重新运行上面的命令来重新开始重复宏。