現在Javaで正規表現の勉強をしています。
結論から言うと、
以下のコードがなぜ8になるか理解したいです。
java
1class Test { 2 public static void main(String[] args) { 3 String data = "This is a pen."; 4 String[] ary = data.split("\\S"); 5 System.out.print(ary.length); 6 } 7} 8
正規表現「\S」が非空白文字を示しているというのは知っています。
(私の環境はmacなので「\S」で想定の結果になりましたが、Windowsだと「¥¥S」と書いたほうがいいかもしれません。)
ただ非空白文字が調べましたがよく理解できず、対象の文字列をどこで分けるか、どのように分けるかが理解できていません。
もし分かる方がいれば教えていただけると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
自己解決
toutouさんのリンク先にある説明が一番しっくりきたので備忘録の為まとめます。
非空白文字と言われるとなじみがないためわかりづらい。
そこで非空白文字を全部カンマに、空文字をアンダースコアに置き換える。
java
1class Test { 2 public static void main(String[] args) { 3 String data = "This is a pen."; 4 String data1 = ",,,,_,,_,_,,,,"; 5 6 String[] ary1 = data1.split(","); // 第二引数なしは「末尾の空文字をカット」 7 System.out.println(ary1.length); // 8 -① 8 String[] ary2 = data1.split(",", -1); // 第二引数−1は「制限なし」 9 System.out.println(ary2.length); // 12 -② 10 } 11}
data1をカンマで区切ると以下のようになる。
(1)空文字
(2)空文字
(3)空文字
(4)空文字
(5)_
(6)空文字
(7)_
(8)_
(9)空文字
(10)空文字
(11)空文字
(12)空文字
12個に区切られる。(②の場合)
しかしsplitメソッドの第二引数がなしの場合は、末尾の空文字がカットされるため
(9)~(12)を数えず、
8個となる。(①の場合)
つまり今回の問題の回答は8となる。
投稿2017/05/15 14:28
総合スコア599
0
まず、どこで分かれるかについては次のようなメソッド呼び出しの結果をみればわかりやすいと思います。
"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 12:38
総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/15 13:00
2017/05/15 13:44
0
Javaの正規表現について - Java [解決済 - 2015/09/13] | 教えて!goo
同じ人?って思っちゃうくらい同じ質問がありましたね。
投稿2017/05/15 12:26
総合スコア2050
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
JAVAが分かっていないので、理解が間違っているのかもしれませんが、8という解がわからなかったため、JavaScript で試してみました。
JavaScript
1data = "This is a pen."; 2ary = data.split(/\S/); 3m = data.match(/\S/g); 4console.log(ary);//["", "", "", "", " ", "", " ", " ", "", "", "", ""] 5console.log(m);//["T", "h", "i", "s", "i", "s", "a", "p", "e", "n", "."] 6console.log(ary.length);//12
こちらは、想定通り(?)12になります。
できれば、この確認したコードのように、ary の中身と、合致文字列を追記していただけないでしょうか?
投稿2017/05/15 12:43
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/15 13:08 編集
退会済みユーザー
2017/05/15 13:15 編集
2017/05/15 14:33
退会済みユーザー
2017/05/15 14:41
2017/05/15 15:35
退会済みユーザー
2017/05/15 21:04
2017/05/15 21:53 編集
退会済みユーザー
2017/05/15 22:18
2017/05/15 23:40
退会済みユーザー
2017/05/16 00:07
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。