zenet_logo

-株式会社ゼネット技術ブログ-

Javaで.【ドット】でsplitしたい

f:id:zenet-tech:20210316165551j:plain
お久しぶりです。ゼネットの阿部です。

Javaでの文字列分割で.【ドット】を使ったところうまく行かなかったので、備忘録として記載します。

"北海道,青森,...,沖縄"のようにカンマ編集されている文字列を分割したいということはよくあると思います。

Javaを利用されている方はすぐに思いつくと思いますが、

String[] cities = "北海道,青森,...,沖縄".split(",");  
for(String city : cities){
  System.out.println(city);
}

とすることで

北海道
青森
・
・
・
沖縄

と配列に分割されます。

ここで、文字列が"北海道.青森.,,,.沖縄"のように.【ドット】で分割されている場合に、カンマの場合と同様に処理させます。

String[] cities = "北海道.青森.,,,.沖縄".split(".");  
for(String city : cities){
  System.out.println(city);
}

とすると例外が発生

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

あれ?分割がうまく行っていない?

ということでOracleDocで調べました。*1

splitの概要には

【この文字列を、指定された正規表現に一致する位置で分割します。】

と記載されていました。

どうやら文字列の.【ドット】が正規表現として判断されたためいずれの文字にも一致しなかったため、分割されていないようだとわかりました。

インターネットで調べてみると、文字を正規表現として意味を持たない文字に変換するためには、

Pattern.quote(".")

とする必要があるとわかりました。

String[] cities = "北海道.青森.,,,.沖縄".split(Pattern.quote("."));  
for(String city : cities){
  System.out.println(city);
}

とすることで

北海道
青森
・
・
・
沖縄

と分割できました

引数で与えた文字が【意味を持たない】文字として利用されるか【正規表現】文字として扱われるのかをしっかり理解しなければ行けないと気付かされた一件でした。

ちなみに余談ですが、

Pattern.quote(".")

の戻り値は

\Q.\E

でした。 これについてはまた今度調べて見たいと思います。

*1:*昔のJavaDocです