Java Scanner,模式以及 useDelimiter() 和 skip() 之间的区别

鲨鱼字节

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

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

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

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

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

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

如果您只是取出*

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

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

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

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

另一件事:您将-first 放在方括号内是正确的如果你不这样做,它可能有不同的含义:

"[a-z]"

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

"[a\\-z]"

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章