【问题标题】:Java Scanner, Pattern and difference between useDelimiter() and skip()Java Scanner、Pattern 以及 useDelimiter() 和 skip() 之间的区别
【发布时间】:2017-06-04 23:25:20
【问题描述】:

java.util.Scanner.useDelimiter()Scanner.skip() 有什么区别?例如,我将这些字符串格式化为如下所示:

String line1 = "0---20.000:\t\t \t12%";
String line2 = "0--20.000:\t  12%";
String line3 = "0-20.000: \t  \t12%";
String error = "0-: \t\t12%";

我需要这个输出:

0
20.000
12

我应该使用一个扫描器和一个对所有三个字符串都有效的模式,并且我需要控制标记为三个,否则抛出异常。

我可以使用两种 Scanner 方法获得此输出吗?

我应该使用哪种正则表达式模式?

它必须对其他数字也有效。

编辑:这是我的尝试:

package scanners;

import java.util.Scanner;

public class ScannerTry {

public static void main(String[] args) {
    String line = "0--20.000:       12%";
    Scanner scan = new Scanner(line);
    scan.useDelimiter("[-*:*\t*%]*");
    while (scan.hasNext()){
        System.out.println(scan.next());
    }
    scan.close();
    }


}

但是输出是:

0
2
0
.
0
0
0
1
2

【问题讨论】:

  • 你的问题不清楚。 SO 是这样一种网站,当您在尝试做某事时遇到问题时,社区会尝试为您提供提示或解决方案。但是,至少你必须尝试。
  • 回答第一个问题:skip 说“我希望这个模式现在出现在输入中,请跳过它”。 useDelimiter 说“当我以后使用next()nextInt() 或任何其他next 方法时,这是我希望出现在'令牌'之间的模式。”
  • 哦,我今天尝试了多少!关键是我没有得到解决方案。我会尝试编辑。

标签: java regex java.util.scanner delimiter


【解决方案1】:

这是您指定为分隔符的内容:

scan.useDelimiter("[-*:*\t*%]*");

方括号包含一个字符列表,使用它们意味着“匹配此列表中的字符”。方括号外的* 表示“匹配这些字符之一的 0 次或多次出现”。

您一次得到一个字符的原因是,当您匹配 0 次或多次出现时,这意味着空字符串(长度为 0 的字符串)与分隔符模式匹配。由于输入文件中的每 2 个字符之间都有一个空字符串(它们之间没有字符,因此匹配一个空字符串),扫描器会将每个字符视为自己的标记。因此,您要做的第一件事是将最后一个* 更改为+,这意味着“匹配1 次或多次出现”。现在空字符串将不匹配。

您的模式的第二个问题是方括号内的* 仅表示星号是您匹配的字符之一; “0 或更多”的含义不适用于方括号内。事实上,只要你有方括号,无论里面是什么,这个模式总是匹配一个字符。因此,任何*+ 或任何您想指定为重复的内容都需要放在方括号之外。

如果你只是拿出*:

scan.useDelimiter("[-:\t%]+");

现在这将匹配-:、制表符和% 字符的任何序列。但是,它与空格不匹配,我在您的一些示例中看到了空格。因此,您可能希望在方括号内添加一个空格。或者你可以这样说:

scan.useDelimiter("[-:\\s%]+");

因为方括号内的\s 组合意味着匹配“任何空白字符”,其中包括空格、制表符和其他一些如换行符。 (但只有当你真的想匹配换行符时才这样做。)

另外一件事:您将- 放在方括号的首位是对的。如果你不这样做,它可能有不同的含义:

"[a-z]"

匹配从az 的任何字符,并且不匹配连字符。然而:

"[a\\-z]"

匹配 az 或连字符。一些程序员(包括我),当我们希望连字符出现在字符集中时,即使没有必要,也会在连字符上使用这个反斜杠,以避免任何可能的混淆:

scan.useDelimiter("[\\-:\t%]+");

【讨论】:

  • 简直完美!简洁明了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多