区切り記号付きのスキャナーを使用していますが、理解したい奇妙な動作に遭遇しました。
私はこのプログラムを使用しています:
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
最初に、空白のトークンを取得する理由がわかりません。ドキュメントには次のように記載されています。
区切りパターンのタイプによっては、空のトークンが返される場合があります。たとえば、パターン「\s+」は、区切り文字の複数のインスタンスに一致するため、空のトークンを返しません。区切りパターン「\s」は、一度に 1 つのスペースしか渡さないため、空のトークンを返す可能性があります。
私が使用して\\s+
いるので、なぜ空白のトークンを返すのですか?
次に、正規表現に関して理解したいことが他にあります。「逆」正規表現を使用して区切り記号を変更すると、次のようになります。
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+");
出力は正しく、次のようになります。
Aller
à
Navigation
rechercher
なぜそれが途中で機能するのですか?
編集 :
この場合:
Scanner sc = new Scanner("(23 ou 24 minutes pour les épisodes avec introduction) (approx.)1");
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+"); //second regex
と の間にまだ空白のトークンがintroduction
ありapprox
ます。それを避けることは可能ですか?