Java扫描程序、模式以及useDelimiter()和skip()之间的差异
java.util.Scanner.useDelimiter和Scanner.skip之间有什么区别?例如,我将这些字符串格式化为如下所示:Java扫描程序、模式以及useDelimiter()和skip()之间的差异,java,regex,java.util.scanner,delimiter,Java,Regex,Java.util.scanner,Delimiter,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 我应该使用一个扫描器和一
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
我应该使用一个扫描器和一个对所有三个字符串都有效的模式,我需要控制令牌是三个,否则会引发异常
我能用这两种扫描方法得到这个输出吗
我应该使用哪种正则表达式模式
它还必须对其他数字有效
编辑:这是我的尝试:
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个字符之间有一个空字符串,所以它们之间没有字符,因此空字符串匹配,扫描器将认为每个字符是它自己的令牌。因此,您要做的第一件事是将最后一个*更改为+,这意味着匹配一个或多个事件。现在,空字符串将不匹配
模式的第二个问题是方括号内的*表示星号是匹配的字符之一;0或更多的含义不适用于方括号内。事实上,只要有方括号,不管括号内是什么,这个模式总是恰好匹配一个字符。因此,要指定为重复的任何*、+,或任何其他内容都需要在方括号之外
如果您只需取出*:
现在,这将匹配-、:、制表符和%字符的任意序列。但是,它与空格不匹配,我在您的一些示例中看到了空格。因此,您可能需要在方括号内添加一个空格。或者你可以这样说:
scan.useDelimiter("[-:\\s%]+");
因为方括号内的\s组合意味着匹配任何空白字符,包括空格、制表符和一些其他字符,如换行符。但只有当你真的想匹配新行时才这样做
还有一件事:你把-first放在方括号内是对的。如果您没有,它可能有不同的含义:
"[a-z]"
匹配从a到z的任何字符,但不匹配连字符。然而:
"[a\\-z]"
匹配a、z或连字符。包括我在内的一些程序员,当我们希望在字符集中使用连字符时,会在连字符上使用此反斜杠,即使在没有必要的情况下,也会使用此反斜杠,以避免任何可能的混淆:
scan.useDelimiter("[\\-:\t%]+");
你的问题不清楚。当你在做某件事时遇到问题,社区会尝试给你提示或解决方案。但是,至少你必须尝试一下。要回答第一个问题:skip说我希望这个模式现在会出现在输入中,请跳过它。useDelimiter说,当我以后使用next或nextInt或任何其他next方法时,这就是我希望出现在“令牌”之间的模式。哦,我今天尝试了多少!关键是我没有得到解决方案。。我会编辑我的尝试。简单完美!简洁明了!
scan.useDelimiter("[\\-:\t%]+");