尝试从文件读取时正则表达式匹配失败(java中的SIC汇编程序)

时间:2016-06-04 03:07:56

标签: java regex

我目前正在使用SIC汇编程序并扫描以下文件中的行:

begin   START   0
main    LDX     zero
copy    LDCH    str1, x
        STCH    str2, x
        TIX     eleven
        JLT     copy

str1    BYTE    C'TEST STRING'
str2    RESB    11
zero    WORD    0
eleven  WORD    11
        END     main

正如您可能已经猜到的那样,我正在使用正则表达式从每行代码中提取字段。现在,我只测试线条是否与正则表达式相匹配(正如它们应该的那样)。如果有,程序会打印出来。问题是,它只识别第一行,并忽略其余的(即从第二行开始,它们与正则表达式不匹配)。 这是迄今为止的代码:

public static void main(String args[]) throws FileNotFoundException {
    Scanner scan = new Scanner(new File("/home/daniel/test.asm"));
    Pattern std = Pattern.compile("(^$|[a-z0-9\\-\\_]*)(\\s+)([A-Z]+)(\\s+)([a-z0-9\\-\\_]*)");
    String lineFromFile;

    lineFromFile = scan.nextLine();
    Matcher standard = std.matcher(lineFromFile);

    while (standard.find()) {
        System.out.println(lineFromFile);
        lineFromFile = scan.nextLine();
    }
}

它只打印第一行:

begin   START   0

奇怪之处在于:如果我直接从文件复制第二行,并用它声明一个String对象,并手动测试它,它确实有效!和其他线路一样。类似的东西:

public static void main(String args[]) throws FileNotFoundException {
    Scanner scan = new Scanner(new File("/home/daniel/test.asm"));
    Pattern std = Pattern.compile("(^$|[a-z0-9\\-\\_]*)(\\s+)([A-Z]+)(\\s+)([a-z0-9\\-\\_]*)");
    String lineFromFile;

    lineFromFile = "main    LDX     zero";
    Matcher standard = std.matcher(lineFromFile);

    if (standard.find())
        System.out.println(lineFromFile);
}

它确实打印出来了!

main    LDX     zero

我不知道它是否与正则表达式或文件有关。如果你们中的任何人帮助我找到错误,我真的很感激。 谢谢你的时间! :)

2 个答案:

答案 0 :(得分:2)

注意: - 我假设你的正则表达式是正确的

您需要为从输入中读取的每一行更新Matcher对象。 (为了演示,我刚刚更新了你的代码,从控制台逐行读取而不是文件。

Java代码

String pattern = "(^$|[a-z0-9\\-\\_]*)(\\s+)([A-Z]+)(\\s+)([a-z0-9\\-\\_]*)"; 

Pattern r = Pattern.compile(pattern);

String line = "";
Matcher m;
while((line = tmp.nextLine()) != null) {
    m = r.matcher(line);
    while(m.find()) {
        System.out.println(m.group(1) + m.group(2)+ m.group(3)+ m.group(4)+ m.group(5));
    }
}

<强> Ideone Demo

但是,在单行

上有多个匹配项之前,使用if就足够了
if(m.find()) {
    System.out.println(m.group(1) + m.group(2)+ m.group(3)+ m.group(4)+ m.group(5));
}

修改

假设您输入中只有三个部分,则可以使用此正则表达式

^((?:\w+)?\s+)(\w+\s+)(.*)$

<强> Regex Demo

答案 1 :(得分:2)

您的正则表达式看起来确实不正确,但这不是您的直接问题。您的plot (x, Deuxgrammes, type="o", col="blue", xlim = c(0,100), ylim=c(26,33)) 循环必须遍历所有行,而不仅仅是匹配的行。如果您使用的是扫描仪,则测试条件为while方法。你在循环中进行匹配。您仍然可以提前创建Matcher并使用hasNextLine()方法将其应用于每一行:

reset()

至于你的正则表达式,最后一部分似乎限制太多 - 无论如何它都不匹配你的样本数据。在第二个空白间隙之后我改变了它以消耗所有东西。我还简化了第一部分并摆脱了不必要的群体。