2010-02-10 54 views
1

我想解析一些C源文件并查找所有字符串(“foo”)。使用java在C代码中搜索字符串

类似的东西工程

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中创建的表达,如“无\”,但与\“ 我在这里发现了一些类似于C的东西http://wordaligned.org/articles/string-literals-and-regular-expressions

在此先感谢

回答

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
0

尝试以下操作:

String patternStr = "\"(([^\"\\\\]|\\\\.)*)\""; 

(我所做的只是转换成Java的正则表达式从the article you mentioned/"([^"\\]|\\.)*"/)。

+0

它的工作原理,但请你解释我是如何工作的? 为什么在关闭组括号之前有四个反斜杠(“]”)? – skyman 2010-02-10 15:15:23

+0

我没有试图完全理解它的工作原理 - 我只是将该文章中的正则表达式翻译为Java。为了翻译它,我需​​要避开引号和反斜杠;因此在Java中每篇文章都变成了“\”,并且每个\变成\\。这就是为什么''''之前的2个反斜杠变为4. – 2010-02-10 15:23:35

+0

我甚至没有尝试这么做,因为这个正则表达式似乎太奇怪了,它不应该在Java上工作;] 如果有人知道会发生什么请求告诉我。 – skyman 2010-02-10 15:58:48

1

什么字符串内注释:

/* foo "this is not a string" bar */ 

,当一个双引号是在评论怎么样:

/* " */ printf("text"); 

你不想捕获"*/ printf("作为一个字符串。换句话说:如果上述可能在您的C代码中出现,请使用解析器而不是正则表达式。

+0

+1,正则表达式有限制,你已经达到其中之一。 – 2010-02-24 22:49:48