我正在使用带有分隔符的扫描仪,我遇到了一个我想理解的奇怪行为。
我正在使用这个程序:
Scanner sc = new Scanner("Aller à : Navigation, rechercher");
sc.useDelimiter("\\s+|\\s*\\p{Punct}+\\s*");
String word="";
while(sc.hasNext()){
word = sc.next();
System.out.println(word);
}
输出是:
Aller
à
Navigation
rechercher
所以首先我不明白为什么我会得到一个空白令牌,文档 says :
根据定界模式的类型,可能会返回空标记。例如,模式“\s+”将不返回空标记,因为它与分隔符的多个实例匹配。分隔模式“\s”可能会返回空标记,因为它一次仅传递一个空格。
我在用着\\s+
那么为什么它返回一个空白令牌呢?
然后我想了解关于正则表达式的另一件事。如果我使用“反向”正则表达式更改分隔符:
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+");
输出是正确的,我得到:
Aller
à
Navigation
rechercher
为什么它会这样工作?
我有一种感觉,您在有空格后跟标点符号的地方导致了两个分隔符捕获。为什么不简单地使用[\\s\\p{Punct}]+
?
这个正则表达式\\s+|\\p{Punct}+
首先捕获空白并吞掉它,然后捕获下一个分隔符作为标点符号。这将是两个彼此相邻的分隔符,中间没有任何内容(空标记)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)