我目前正在使用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
我不知道它是否与正则表达式或文件有关。如果你们中的任何人帮助我找到错误,我真的很感激。 谢谢你的时间! :)
答案 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()
至于你的正则表达式,最后一部分似乎限制太多 - 无论如何它都不匹配你的样本数据。在第二个空白间隙之后我改变了它以消耗所有东西。我还简化了第一部分并摆脱了不必要的群体。