Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的正则表达式解释源.c文件_Java_Regex - Fatal编程技术网

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

Java中的正则表达式解释源.c文件,java,regex,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 */" 我想摆脱/*我们正在做内核

我必须识别.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 */"
我想摆脱
/*我们正在做内核工作*/

我尝试了所有我无法摆脱的东西。我就在这里:

Pattern cdef = Pattern.compile("^#[\\t ]*define[\\t ]+(\\w+)[\\t ]*(.*)",Pattern.DOTALL);
我已尝试添加
^[\/\*\\w+]
[\\t]+^\/+\*\\w*\\
。。。。。在字符串的末尾,但要么我丢失了所有第二组,要么它什么也不做

非常感谢

!!!!编辑:我想找到一种消除C注释的方法,因此:/*comment*/从模式中删除

编辑2:从我的角度来看,我认为应该有一种方法给出以下说明: “如果您找到“/”,请不要再拿任何东西,我正在逐行阅读文件,以便可以扔掉“/”后面的内容:


这就是我处理第二组的地方:“…..”,因此我尝试在字符串末尾添加^[\/\],但它不起作用,我丢失了整个第二部分。一种简单的方法是逐字符预处理源序列,并在这两者之间跳过,如:

// 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();
        }
    }
}

您几乎拥有了它。只需在字符串末尾指定注释。如下所示:

(\\/\\*.*\\*\\/)
完整的测试程序:

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));
    }
}

我没有解决方案。思考是很难实现的。我在这里问了类似的问题:。看一看。谢谢,但它并不完全相同,因为基本上你是在搜索系统。out…但我搜索的是/*xxxx*/thks。这是真的,这是一个简单的方法或删除(“xxx”)但是我想在正则表达式中找到一种方法,因为我正在学习这一点。
/
在正则表达式中没有特殊意义,所以您可以将其写成
(/\\*.\\*/)
。千万不要错过在Java正则表达式中避免使用反斜杠的机会。;)但是,您的正则表达式要求存在注释。我相信OP希望避免在注释存在时使用注释。
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 */