4

区切り記号付きのスキャナーを使用していますが、理解したい奇妙な動作に遭遇しました。

私はこのプログラムを使用しています:

    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ます。それを避けることは可能ですか?

4

2 に答える 2

1

空白の後に句読点が続く場所で、2 つの区切り文字のキャプチャが発生しているように感じます。単に使用しないのはなぜ[\\s\\p{Punct}]+ですか?

この正規表現\\s+|\\p{Punct}+は、最初に空のスペースをキャプチャして飲み込み、次に次の区切り文字を句読点としてキャプチャします。これは、間に何も挟まない 2 つの区切り文字 (空のトークン) です。

于 2012-05-26T11:13:27.840 に答える
0

Scanner クラスでも空のトークンの問題が発生しました。区切り文字のパターンは、括弧で囲み、グループに+を追加して、貪欲にする必要があると思います。使ったパターンはこんな感じ

"((\\s)+|(\\\\r\\\\n)+|\\p{Punct}+)+". 
于 2015-02-11T19:44:21.927 に答える