使用java在C代码中搜索字符串

时间:2010-02-10 13:37:48

标签: java regex

我想解析一些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的东西

提前致谢。

3 个答案:

答案 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