Java中的正则表达式解释source.c文件

时间:2011-08-30 09:41:46

标签: java regex

我必须识别.c文件中的某些字符。现在我必须识别#define行,但我想在定义后排除注释。例如:

#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:我看待它的方式我认为应该有一种方法来给出以下结构:  “如果你发现”/ “,请不要采取任何其他措施,我正在逐行阅读文件,以便在之后可以扔掉任何东西:

这是我对待第二组的地方:“....(。)”所以我尝试在我的字符串末尾添加^ [\ / \ ]但它不起作用我失去了整个第二部分

2 个答案:

答案 0 :(得分: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 */

答案 1 :(得分:0)

对我来说,一个简单的方法是预处理源序列char-by-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();
        }
    }
}