【问题标题】:How do I use a delimiter with Scanner.useDelimiter in Java?如何在 Java 中使用带有 Scanner.useDelimiter 的分隔符?
【发布时间】:2015-04-30 05:48:51
【问题描述】:
sc = new Scanner(new File(dataFile));
sc.useDelimiter(",|\r\n");

我不明白分隔符是如何工作的,有人可以用外行的方式解释一下吗?

【问题讨论】:

  • 正如 javadoc 所说,“使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值”。还不清楚吗?
  • @ema——我认为这是开玩笑的,因为只有当您已经“了解分隔符的工作原理”而 NoMoreErrors 不了解时才清楚。例如,什么是“分隔符模式”可能只是不清楚你所说的,这肯定没有错,只是对 Q 没有帮助。但至少你没有像很多人那样侮辱 NoMoreErrors,高兴地,我想。

标签: java java.util.scanner delimiter


【解决方案1】:

例如:

String myInput = null;
Scanner myscan = new Scanner(System.in).useDelimiter("\\n");
System.out.println("Enter your input: ");
myInput = myscan.next();
System.out.println(myInput);

这将允许您使用 Enter 作为分隔符。

因此,如果您输入:

Hello world (ENTER)

它将打印“Hello World”。

【讨论】:

  • 是的,但它是如何工作的?两个反斜杠有什么用?但是万岁,现在我们知道如何使用 Enter 作为分隔符了。假设它有效。
【解决方案2】:

扫描器还可以使用空格以外的分隔符。

来自Scanner API的简单示例:

 String input = "1 fish 2 fish red fish blue fish";

 // \\s* means 0 or more repetitions of any whitespace character 
 // fish is the pattern to find
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");

 System.out.println(s.nextInt());   // prints: 1
 System.out.println(s.nextInt());   // prints: 2
 System.out.println(s.next());      // prints: red
 System.out.println(s.next());      // prints: blue

 // don't forget to close the scanner!!
 s.close(); 

重点是理解Scanner::useDelimiter里面的正则表达式(regex)。查找useDelimiter 教程here


从正则表达式开始here you can find 一个不错的教程。

注意事项

abc…    Letters
123…    Digits
\d      Any Digit
\D      Any Non-digit character
.       Any Character
\.      Period
[abc]   Only a, b, or c
[^abc]  Not a, b, nor c
[a-z]   Characters a to z
[0-9]   Numbers 0 to 9
\w      Any Alphanumeric character
\W      Any Non-alphanumeric character
{m}     m Repetitions
{m,n}   m to n Repetitions
*       Zero or more repetitions
+       One or more repetitions
?       Optional character
\s      Any Whitespace
\S      Any Non-whitespace character
^…$     Starts and ends
(…)     Capture Group
(a(bc)) Capture Sub-group
(.*)    Capture all
(ab|cd) Matches ab or cd

【讨论】:

  • 仅供参考:这一行:Scanner s = new Scanner(input).useDelimiter("\\sfish\\s");实际上存在资源泄漏,即使您调用 s.close()。泄漏发生在调用 useDelimiter 的扫描仪上。如果您改为致电Scanner s = new Scanner(input); s.useDelimiter(\\s*fish\\s);,则可以避免此问题。
  • @georges 实际上我的行是: ("\\sfish\\s")... 不是 ("\\sfish\\s") 但你能请澄清你的意思?
  • 换句话说,对于新手来说,这个答案和 cmets 对 NoMoreErrors 没有任何帮助。学习regex只为使用Scanner??????当然,这会有所帮助,但它已经超出了他的需要。举个例子吧。简单的该死的例子。
  • @DSlomer64 实际上你不需要regex 来使用Scanner 但是如果你想使用你的自定义分隔符必须使用regex 因为这是useDelimiter 方法接受的输入.这就是 OP 所要求的,只要被接受为答案,恕我直言,它适合 OP。为什么你认为OP是新手?如果是新手,这是您的情况并且答案不适合您,请提出一个新问题:)
  • @JordiCastilla--OP 几乎绝对是一个新手,因为他的问题和代表 353 的水平。所以他的useDelimiter 示例当然需要解释,我的观点是我们需要考虑用户体验和实际需要而不是切线(从用户的角度来看),但你让我意识到这一点:用户可以退出阅读 cmets 一旦他太深或继续阅读以了解更多信息。我从OP的心意。你的观点很好。 :^}
【解决方案3】:

使用 Scanner,默认分隔符是空白字符。

但 Scanner 可以根据一组分隔符定义标记开始结束的位置,可以通过两种方式指定:

  1. 使用扫描仪方法:useDelimiter(String pattern)
  2. 使用 Scanner 方法:useDelimiter(Pattern pattern) 其中 Pattern 是指定分隔符集的正则表达式。

所以useDelimiter() 方法用于标记扫描器输入,其行为类似于StringTokenizer class,请查看这些教程以获取更多信息:

这是Example

public static void main(String[] args) {

    // Initialize Scanner object
    Scanner scan = new Scanner("Anna Mills/Female/18");
    // initialize the string delimiter
    scan.useDelimiter("/");
    // Printing the tokenized Strings
    while(scan.hasNext()){
        System.out.println(scan.next());
    }
    // closing the scanner stream
    scan.close();
}

打印此输出:

Anna Mills
Female
18

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多