Java中的正则表达式解释源.c文件
我必须识别.c文件中的一些字符。现在我必须识别#define行,但我想排除定义后的注释。例如: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 */" 我想摆脱/*我们正在做内核
#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 */