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]"
匹配从a
to 的任何字符z
,并且不匹配连字符。然而:
"[a\\-z]"
火柴a
,z
或连字符。一些程序员(包括我),当我们希望在字符集中使用连字符时,即使没有必要,也会在连字符上使用这个反斜杠,以避免任何可能的混淆:
scan.useDelimiter("[\\-:\t%]+");
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句