2

我知道这很简单,但我不知道为什么它不起作用。

我尝试检查扫描仪中的下一个字符串是否与模式匹配:字符串应以

" DESCRIPTION". 所以,我尝试:

Scanner sc = new Scanner("   DESCRIPTION = 'Header for scroller'");
System.out.println("Has Next = " + sc.hasNext("\\s+DESCRIPTION.*"));

但它不起作用,为什么?更简单的正则表达式工作正常:

 Scanner sc = new Scanner("   DESCRIPTION = 'Заголовки таблиц скроллеров'");
 System.out.println("Has Next = " + sc.hasNext(".*DESCRIPTION.*"));
4

5 回答 5

2

sc.hasNext(pattern)true如果下一个标记匹配,则返回pattern

这里的下一个标记是"DESCRIPTION".

  • "DESCRIPTION" 火柴 .*DESCRIPTION.*
  • "DESCRIPTION" 不匹配 \s+DESCRIPTION.*(因为令牌前没有空格)

你可以试试这个:

Scanner sc = new Scanner("   DESCRIPTION = 'Header for scroller'");
System.out.println("Has Next = " + sc.hasNext("DESCRIPTION.*"));
有下一个 = true
于 2013-07-23T14:59:51.170 回答
1

来自 JavaDocScanner#hasNext(String pattern)

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

所以

sc.hasNext("\\s+DESCRIPTION.*")

返回 false 因为下一个标记是DESCRIPTION(没有任何空格)并且

sc.hasNext(".*DESCRIPTION.*")

返回 true 因为在.*之前和之后都匹配 0 个字符DESCRIPTION

于 2013-07-23T15:00:44.273 回答
0

也许不是你要找的,但是

Scanner sc = new Scanner("   DESCRIPTION = 'Header for scroller'".trim());
System.out.println("Has Next = " + sc.hasNext("^DESCRIPTION.*"));

为我做了伎俩...

于 2013-07-23T15:02:29.403 回答
0

这对您不起作用,因为 Scanner 使用空格作为默认分隔符。因此 hasNext 无法找到 \s+DESCRIPTION 并找到 .*DESCRIPTION.* 或只是DESCRIPTION.*。如果您将代码更改为

Scanner sc = new Scanner("   DESCRIPTION = 'Header for scroller'");
sc.useDelimiter( "_" );
System.out.println("Has Next = " + sc.hasNext("\\s+DESCRIPTION.*"));

那么你会得到预期的结果。

于 2013-07-23T15:17:59.830 回答
0

这是因为扫描仪的默认分隔符模式是\p{javaWhitespace}+

因此,下一个令牌变成DESCRIPTION而不是<space><space>DESCRIPTION

于 2013-07-23T15:06:20.327 回答