使用此表格获取数字 \d\s\d\d\s\d

3
我试图从这个表单中获取数字28,该表单包含整数+空格+整数+整数+空格+整数。我尝试使用这个正则表达式\\s\\d\\d\\s,但是它会得到两个数字1128
使用这个表达式\\d\\s\\d\\d\\s\\d时,我遇到了这个错误java.lang.NumberFormatException: For input string: "4 60 1"
该数字不应具有字母+空格+整数+整数+空格的形式。
我该如何解决?
ZOB/Hauptbahnhof Bussteig 11 20:04 20:34 28 21:08 21:40 22:08 22:40 23:08 23:40 00:30

代码:

Pattern pattern = Pattern.compile("\\s\\d\\d\\s");
//Pattern pattern = Pattern.compile("\\d\\s\\d\\d\\s\\d");

Matcher m = pattern.matcher(line);
while (m.find()) {
    value = Integer.parseInt(m.group().trim());
    if (value != 10) {
        line = line.replace(m.group(), " ").replaceAll(" +", " ");
        writer.println("Min:" + value);

        // String line3 = scanner.nextLine();

        System.out.println(value
                + " has been found in this text document " + newName);
    }

}

这只是一个打字错误,我已经纠正了。 - MrPencil
在这种情况下,请在发布问题之前进行拼写检查。如果您在此处发布问题时没有展示出努力,那么为什么我们要花费精力来回答它们呢? - Boris the Spider
2个回答

4
你需要使用正向/反向预查(lookarounds)来解决这个问题。
Pattern pattern = Pattern.compile("(?<=\\d\\s)\\d{2}(?=\\s\\d)");

这不需要去除任何空格。

演示

  • (?<=\\d\\s) 正向后瞻,断言匹配项必须前面是一个数字和一个空格。

  • \d{2} 精确匹配两个数字。

  • (?=\\s\\d) 断言匹配的数字后面必须跟一个空格和一个数字。


0

你的问题不是你尝试匹配的模式。这个模式符合你所描述的 4 60 1。问题在于你试图使用 Integer.parseInt() 解析整个匹配结果,显然这不是一个有效的整数。

假设你想要得到数字4601作为结果,你需要在解析之前对输入进行清洗(去除空格):

value = Integer.parseInt(m.group().trim().replaceAll("\\s", ""));

编辑:第二次阅读后,您的模式似乎无法提供您想要的输出,因此此答案无法解决您的实际问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接