我想解析一些C源文件并查找所有字符串(“foo”)。
类似的东西
String line = "myfunc(\"foo foo foo\", \"bar\");";
System.out.println(line);
String patternStr = "\\\"([^\"]+)\\\"";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher("");
String s;
if(line.matches(".*"+patternStr+".*"))
matcher.reset(line);
while(matcher.find()) {
System.out.println(" FOUND "+matcher.groupCount()+" groups");
System.out.println(matcher.group(1));
}
直到没有“转义引用字符串”,如
String line = "myfunc(\"foo \\\"foo\\\" foo\", \"bar\");";
我不知道如何在Java中创建表达式,如“没有\”,但是使用\。 我在http://wordaligned.org/articles/string-literals-and-regular-expressions
找到了类似于C的东西提前致谢。
答案 0 :(得分:1)
评论中的字符串怎么样:
/* foo "this is not a string" bar */
当评论中出现单个双引号时:
/* " */ printf("text");
您不希望将"*/ printf("
捕获为字符串。
换句话说:如果您的C代码中出现上述 ,请使用解析器而不是正则表达式。
答案 1 :(得分:0)
尝试以下方法:
String patternStr = "\"(([^\"\\\\]|\\\\.)*)\"";
(我所做的就是从the article you mentioned转换为Java regexp:/"([^"\\]|\\.)*"/
)。
答案 2 :(得分:0)
在双引号之间,您希望允许转义序列或除双引号之外的任何字符。您希望按顺序测试它们,以便让更长的替代方案有机会匹配。
Pattern pattern = Pattern.compile("\"((\\\\.|[^\"])+)\"");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
System.out.println(" FOUND "+matcher.groupCount()+" groups");
System.out.println(matcher.group(1));
}
输出:
FOUND 2 groups foo \"foo\" foo FOUND 2 groups bar