Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java扫描程序、模式以及useDelimiter()和skip()之间的差异_Java_Regex_Java.util.scanner_Delimiter - Fatal编程技术网

Java扫描程序、模式以及useDelimiter()和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 我应该使用一个扫描器和一

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
我应该使用一个扫描器和一个对所有三个字符串都有效的模式,我需要控制令牌是三个,否则会引发异常

我能用这两种扫描方法得到这个输出吗

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

它还必须对其他数字有效

编辑:这是我的尝试:

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%]+");