gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:58:44 26 4
gpt4 key购买 nike

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

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

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

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

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

编辑:这是我的尝试:

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 个字符之间都有一个空字符串(它们之间没有字符,因此空字符串匹配),因此扫描器会将每个字符视为自己的标记。因此,您要做的第一件事就是将最后一个 * 更改为 +,这意味着“匹配 1 次或多次出现”。现在空字符串将不匹配。

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

如果你只是取出*:

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

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

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

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

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

"[a-z]"

匹配从az的任何字符,但不匹配连字符。但是:

"[a\\-z]"

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

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

关于Java Scanner,模式以及useDelimiter()和skip()之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44359789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com