我必须识别.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:我看待它的方式我认为应该有一种方法来给出以下结构: “如果你发现”/ “,请不要采取任何其他措施,我正在逐行阅读文件,以便在之后可以扔掉任何东西:
这是我对待第二组的地方:“....(。)”所以我尝试在我的字符串末尾添加^ [\ / \ ]但它不起作用我失去了整个第二部分
答案 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();
}
}
}