Java Scanner Regex InputMistmastchException

Java Scanner Regex InputMistmastchException,java,regex,pattern-matching,java.util.scanner,delimiter,Java,Regex,Pattern Matching,Java.util.scanner,Delimiter,我读过其他几篇文章,但我无法找出以下代码的内在错误以及为什么会引发异常: public static void main(String[] args) { Scanner scanner = new Scanner(" 0 B 2 # L"); String first = scanner.next("[0-9]+ [abB#]"); String second = scanner.next("[0-9]+ [abB#] [LR]"); System.out

我读过其他几篇文章,但我无法找出以下代码的内在错误以及为什么会引发异常:

public static void main(String[] args) {

    Scanner scanner = new Scanner(" 0 B 2 # L");

    String first = scanner.next("[0-9]+ [abB#]");
    String second = scanner.next("[0-9]+ [abB#] [LR]");

    System.out.println(first); 
    System.out.println(second);

}
预期产出:

0 B
2 # L
引用以下文件:

如果下一个标记与由指定字符串构造的模式匹配,则返回该标记

默认情况下(您没有更改),扫描器将在空白处分割令牌,因此扫描器返回的令牌为:

"0"
"B"
"2"
"#"
"L"
第一个
下一个
标记是
“0”
,它与
“[0-9]+[abB#]”
不匹配,因此您会得到
输入不匹配异常

解决方案

不要使用
扫描仪

Pattern p = Pattern.compile(" *([0-9]+ [abB#]) +([0-9]+ [abB#] [LR]) *");
Matcher m = p.matcher(" 0 B 2 # L");
if (m.matches()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}
引用以下文件:

如果下一个标记与由指定字符串构造的模式匹配,则返回该标记

默认情况下(您没有更改),扫描器将在空白处分割令牌,因此扫描器返回的令牌为:

"0"
"B"
"2"
"#"
"L"
第一个
下一个
标记是
“0”
,它与
“[0-9]+[abB#]”
不匹配,因此您会得到
输入不匹配异常

解决方案

不要使用
扫描仪

Pattern p = Pattern.compile(" *([0-9]+ [abB#]) +([0-9]+ [abB#] [LR]) *");
Matcher m = p.matcher(" 0 B 2 # L");
if (m.matches()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}
在使用时,它会对整个输入进行分隔。在您的情况下,它用空格分隔(默认值):

Scanner
使用分隔符模式将其输入分解为标记,默认情况下,分隔符模式与空白相匹配

@Andreas描述了异常的根本原因

现在,解决方案是使用忽略分隔符的方法

和方法独立于分隔符模式进行操作。这些方法将尝试匹配指定的模式,而不考虑输入中的分隔符,因此可以在分隔符不相关的特殊情况下使用

您可以使用:

一个简单的
Matcher
regex解决方案:

String str = " 0 B 2 # L";
Pattern ptrn = Pattern.compile("[0-9]+ [abB#] [LR]|[0-9]+ [abB#]");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}

较长的选项必须在较短的选项之前出现,以获得正确的匹配。

使用时,它将整个输入分隔开来。在您的情况下,它用空格分隔(默认值):

Scanner
使用分隔符模式将其输入分解为标记,默认情况下,分隔符模式与空白相匹配

@Andreas描述了异常的根本原因

现在,解决方案是使用忽略分隔符的方法

和方法独立于分隔符模式进行操作。这些方法将尝试匹配指定的模式,而不考虑输入中的分隔符,因此可以在分隔符不相关的特殊情况下使用

您可以使用:

一个简单的
Matcher
regex解决方案:

String str = " 0 B 2 # L";
Pattern ptrn = Pattern.compile("[0-9]+ [abB#] [LR]|[0-9]+ [abB#]");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}


要获得正确的匹配,较长的选项必须先于较短的选项。

因此,即使模式匹配包含一个空间来消耗字符串中的空间,java已经标记了字符串以进行比较?java没有,
Scanner
有,如
next(string)
中所述,或者更确切地说,它还没有消耗任何东西。您可以尝试或跳过使用
Scanner
,只使用regex解析整个字符串。因此,即使模式匹配包含一个空间来使用字符串中的空间,java已经标记了字符串以进行比较?java没有,
Scanner
有,如
下一个(字符串)
中所述,或者更确切地说,它还没有消耗任何东西。您可以尝试或跳过使用
Scanner
,只使用regex解析整个字符串。这是我在原始解决方案中使用的,我只是不喜欢它解析字符串“0q2#L”,例如,第一个将匹配“2#”,第二个将返回null,但是如果这就是实现,那么我想这就是我需要使用itI的方式。我用一个简单的
Matcher
regex解决方案更新了我的答案。请注意备选方案的放置方式:长是第一位,短是第二位。这是我在原始解决方案中使用的,我只是不喜欢它解析字符串“0 q 2#L”,例如,第一个将匹配“2#”,然后第二个将返回null,但是如果这就是实现,那么我想这就是我需要使用itI的方式。我用一个简单的
Matcher
regex解决方案更新了我的答案。注意备选方案的放置方式:长为第一,短为第二。