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解决方案更新了我的答案。注意备选方案的放置方式:长为第一,短为第二。