質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

正規表現を理解したい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,024

k499778

score 542

現在Javaで正規表現の勉強をしています。

結論から言うと、
以下のコードがなぜ8になるか理解したいです。

class Test {
  public static void main(String[] args) {
    String data = "This is a pen.";
    String[] ary = data.split("\\S");
    System.out.print(ary.length);
  }
}

正規表現「\\S」が非空白文字を示しているというのは知っています。
(私の環境はmacなので「\\S」で想定の結果になりましたが、Windowsだと「¥¥S」と書いたほうがいいかもしれません。)

ただ非空白文字が調べましたがよく理解できず、対象の文字列をどこで分けるか、どのように分けるかが理解できていません。

もし分かる方がいれば教えていただけると助かります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

check解決した方法

+4

toutouさんのリンク先にある説明が一番しっくりきたので備忘録の為まとめます。

非空白文字と言われるとなじみがないためわかりづらい。
そこで非空白文字を全部カンマに、空文字をアンダースコアに置き換える。

class Test {
    public static void main(String[] args) {
        String data = "This is a pen.";
        String data1 = ",,,,_,,_,_,,,,";

        String[] ary1 = data1.split(","); // 第二引数なしは「末尾の空文字をカット」
        System.out.println(ary1.length); // 8  -①
        String[] ary2 = data1.split(",", -1); // 第二引数−1は「制限なし」
        System.out.println(ary2.length); // 12 -②
    }
}

data1をカンマで区切ると以下のようになる。

(1)空文字
(2)空文字
(3)空文字
(4)空文字
(5)_
(6)空文字
(7)_
(8)_
(9)空文字
(10)空文字
(11)空文字
(12)空文字

12個に区切られる。(②の場合)

しかしsplitメソッドの第二引数がなしの場合は、末尾の空文字がカットされるため
(9)~(12)を数えず、
8個となる。(①の場合)

つまり今回の問題の回答は8となる。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

まず、どこで分かれるかについては次のようなメソッド呼び出しの結果をみればわかりやすいと思います。

"This is a ".replaceAll("\\S", "|");

さて、なぜ8かは正規表現云々の話とはほとんど関係なくてsplitの仕様です。

"This is a " ...(1)
"This is a pen." ...(2)

上記のどちらもsplitの結果は同一となります。(1)の結果が8になるのは疑問ではないと思います。(2)が8になるから疑問を持たれたのでしょう。こうなる理由はsplitのリファレンスをお読みになれば明らかになるはずです。

(私の環境はmacなので「\\S」で想定の結果になりましたが、Windowsだと「¥¥S」と書いたほうがいいかもしれません。) 

おっしゃりたいことがわかりませんでした。本件についていえばWindows, Mac, LinuxいずれのOSで実行しても結果は同じです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/15 21:44

    回答ありがとうございます。

    splitをもう少し勉強してみます。

    よく正規表現は¥¥Sという書き方をしていたので、Macならではの書き方なのかと思ってしまいました。
    そうだったんですね。勉強になりました。

    キャンセル

  • 2017/05/15 22:00

    > 勉強
    リファレンスさえ読めば、それが書いてある・・・と思ったのですが、リファレンスに書かれている表現が硬すぎてわかりにくいということだったでしょうかね。だとすると慣れるしかないですが。表現は堅いので読みやすいとは言えないかも知れませんが、一番確実に明確に仕様が書いてあるのはリファレンスであることが多いですので。
    > Macならではの書き方
    OSに依存する仕様は例えば「パスセパレーター」のようにJava側で決められず、各OSでの決まりごとに左右されるものです。正規表現の仕様についてはOSではなく、「どの正規表現ライブラリーを使うか」によって変わります。つまりJavaなのかjavascriptなのかといったような違いです。

    キャンセル

  • 2017/05/15 22:44

    そうですね。毎回リファレンスは見るのですがやはり腰を据えて読まないと本質的なところがなかなか理解しづらい印象です。ある程度Javaの経験も増えてきて、本当に詳しく書いてあるのはリファレンスであり、それが神様だということを実感してきたのでそろそろ慣れていこうとは思っています。

    パスセパレーター...そのような言葉があるのですね。まだなかなか馴染みのないところで踏み込んでいない分野ですね。新しいことが知れてまた丁寧に教えてくださる回答者様がいて良かったです。感謝しています。

    キャンセル

+3

Javaの正規表現について - Java [解決済 - 2015/09/13] | 教えて!goo
同じ人?って思っちゃうくらい同じ質問がありましたね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/15 21:38

    回答ありがとうございます。

    同一人物ではないですが、笑
    ほとんど同じ内容ですね。

    ちなみにどのように検索されたか教えたもらうことはできますか?
    そこが私の課題だと思ったので

    キャンセル

  • 2017/05/15 21:46

    残念ながら自分はあまり正規表現に詳しくないので、\\sって何だっけなと思い「java 正規表現 非空白文字」でとりあえずぐぐってみたら見つかりましたね。これから解析する予定でした。

    キャンセル

  • 2017/05/15 22:39

    返答ありがとうございます。参考にさせていただきます。

    キャンセル

-1

JAVAが分かっていないので、理解が間違っているのかもしれませんが、8という解がわからなかったため、JavaScript で試してみました。

data = "This is a pen.";
ary = data.split(/\S/);
m = data.match(/\S/g);
console.log(ary);//["", "", "", "", " ", "", " ", " ", "", "", "", ""]
console.log(m);//["T", "h", "i", "s", "i", "s", "a", "p", "e", "n", "."]
console.log(ary.length);//12

こちらは、想定通り(?)12になります。
できれば、この確認したコードのように、ary の中身と、合致文字列を追記していただけないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/16 07:18

    > ただ聞いておいてそのような上から言う言い方をする感覚が気になりました。

    猛烈なブーメランなのですが^^;
    あなたがリファレンスを読むことを期待して、回答者がリファレンスを読むように誘導してくれているにもかかわらず、そうでは無いページを最重要視するって、相当ひどい行為なの理解してますか?

    > そしたら思わぬ角度からの返答が来た。
    > そしてリファレンス読みましたよ。

    良かったです。このコメントしたかいがありました。

    キャンセル

  • 2017/05/16 08:40

    違うんですよ。回答者様に返答する前に自己回答載っけていてリファレンス読んだ上での内容載っけていたのにすごく強く来れたので、え?ってなったんですよ笑

    リファレンスの重要性は伝わりました。ありがとうございました。

    キャンセル

  • 2017/05/16 09:07

    KSwordOfHaste さんと honami さんに対しての申し訳ない思いは共有できないようなので、コメントはここまでにしますが、もう少し回答者を理解した方がいいですよ。。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る