2011-08-30 47 views
0

我必须识别.c文件中的某些字符。现在我不得不承认#define行,但我想排除定义后的评论。例如:Java中的正则表达式解释source.c文件

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */ 

我有这方面的结果:

group1="KERNEL_VERSION" 
group2="(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */" 

我想摆脱/* We're doing kernel work */

我已经尝试了一切我无法摆脱它。下面是我在哪里:

Pattern cdef = Pattern.compile("^#[\\t ]*define[\\t ]+(\\w+)[\\t ]*(.*)",Pattern.DOTALL); 

我曾尝试加入^[\\/\\*\\w+][\\t ]+^\\/+\\*\\w*\\ .....字符串的结束,但无论是我失去所有的第二组,或者什么也不做

非常感谢,

!!!!编辑:我想找到一种方法来消除C评论,所以:/ *评论* /从模式

编辑2:我看到它的方式我认为它应该有一种方法来给出以下建议: “如果你发现‘/ ’,不采取任何东西,我读通过行的文件行,以便无论是后/可以扔掉:

这是我处理第二组:“......()”所以我尝试添加^ [\/\]在我的字符串的结尾,但它不工作,我失去了整个第二部分

+1

我没有解决方案。想想很难实现。我在这里问了类似的东西:http://stackoverflow.com/questions/5374843/regex-to-find-an-uncommented-println。看一看。 – Heisenbug

+0

谢谢,但它不完全相同,因为基本上你正在搜索System.out ...但我正在搜索的是/ * xxxx */ – vallllll

回答

1

你几乎有它。只需在字符串末尾指定注释即可。就像这样:

(\\/\\*.*\\*\\/) 

完整的测试程序:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TestMain { 
    public static void main(String[] args) { 
     Pattern cdef = Pattern.compile("^#[\\t ]*define[\\t ]+(\\w+)[\\t ]*(.*)(\\/\\*.*\\*\\/)", Pattern.DOTALL); 
     Matcher matcher = cdef 
       .matcher("#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */"); 
     System.out.println(matcher.matches()); 
     for (int n = 0; n <= matcher.groupCount(); n++) 
      System.out.println(matcher.group(n)); 
    } 
} 

输出:

true 
#define KERNEL_VERSION(a,b,c) ((a)/65536+(b)/256+(c)) /* We're doing kernel work */ 
KERNEL_VERSION 
(a,b,c) ((a)/65536+(b)/256+(c)) 
/* We're doing kernel work */ 
+2

'/'在正则表达式中没有特殊含义,所以你可以写成'(/\\*.*\\*/)'。切勿放弃避免在Java正则表达式中使用反斜杠的机会。 ;) –

+0

但是,您的正则表达式*需要*注释才能出现。我相信OP希望避免在评论中出现这些评论。 –

+0

到Arne和Alan Moore现在完美地工作! – vallllll

0

对我来说,一个简单的办法是预处理源序列字符按char和跳过所有像之间:

// don't take all literally, pseudocode below 
while(!EOF) 
{ 
    // read next char 
    ReadChar(); 

    // check for comment start 
    if(prevChar == '/' && curChar == '*') 
    { 
     // remove '/' from output 
     OutputContainer.RemoveLastChar(); 
     while(!(prevChar == '*' && curChar == '/')) 
     { 
      // skip next char 
      SkipChar(); 
     } 
    } 
} 
+0

这是真的,这是简单的方法或做一个删除(“xxx”),但我会喜欢在正则表达式中找到一种方法,因为我正在学习这一点。 – vallllll