扫描程序中的Java正则表达式

时间:2013-07-23 14:51:23

标签: java regex

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

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

开头

" 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.*"));

5 个答案:

答案 0 :(得分: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.*"));
Has Next = true

答案 1 :(得分:1)

来自Scanner#hasNext(String pattern)

的JavaDoc
  

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

所以

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

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

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

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

答案 2 :(得分:0)

也许不是你想要的,但是

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

为我做了诀窍......

答案 3 :(得分:0)

因为扫描程序的默认分隔符模式为\p{javaWhitespace}+

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

答案 4 :(得分: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.*"));

那么你会期待结果。