应该在java.util.Scanner中使用什么模式来获取下一个String标识符?

Joh*_*oth 4 java pattern-matching java.util.scanner

在一行文本中,我有" *(,identifier1*(identifier2",我想读取标识符,定义为单词字符([a-zA-Z_0-9]).

我应该使用哪种模式?我想过使用:

scanner.next( "[\\w]+");
Run Code Online (Sandbox Code Playgroud)

但我得到了例外 java.util.InputMismatchException

Bar*_*ers 5

扫描仪的默认分隔符是空格,因此Scanner对象中的第一个(也是唯一的)标记是整个字符串"*(,identifier1*(identifier2".你试图通过调用获得的字符串next("[\\w]+"),这会导致异常被抛出,因为它与你的输入不匹配.

你所追求的更像是findInLine("\\w+"):

Scanner scan = new Scanner("*(,identifier1*(identifier2");
System.out.println(scan.findInLine("\\w+"));
System.out.println(scan.findInLine("\\w+"));
Run Code Online (Sandbox Code Playgroud)

产生:

identifier1
identifier2
Run Code Online (Sandbox Code Playgroud)

或者,如果要将输入字符串拆分为一个或多个非(ascii)alpha-num-chars(和_),请尝试:

Scanner scan = new Scanner("*(,identifier1*(identifier2").useDelimiter("\\W+");
while(scan.hasNext()) {
  System.out.println(scan.next());
}
Run Code Online (Sandbox Code Playgroud)

它产生与以前相同的输出.

请注意,我使用了大写W,它等于:

\W == [^\w] == [^a-zA-Z0-9_]
Run Code Online (Sandbox Code Playgroud)

  • @John,是的,如果流中的下一个标记与您提供的模式不匹配,它会抛出异常.如果你将`scanner.next("[\\ w] +");`更改为`scanner.inxt(".+");`它将正确匹配你的第一个令牌(等于整个输入字符串). (2认同)