我知道这很简单,但我不知道为什么它不起作用。
我尝试检查扫描程序中的下一个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.*"));
答案 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)
如果下一个标记与从中构造的模式匹配,则返回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.*"));
那么你会期待结果。