文字列を特定の文字やパターンで配列に分割するには (explode / split)

文字列を特定の区切り文字や正規表現で表すパターンで分割して配列を生成する方法の、プログラミング言語別メモ。

コマンドではsplitというのもあるが、このコマンドはパターンではなく一定のサイズごとにファイルを分割する。

Go言語 strings.Split(str, ",")
Java str.split(",")
Scala str.split(",")
PHP explode(",", $str)
Python str.split(",")
Ruby str.split(",")
Perl split(/,/, $str)

関連

スポンサーリンク

Go言語

import "strings"

var arr []string
arr = strings.Split(str, ",")

Java

Signature:

空文字列をsplitすると空文字列1つだけの配列を返す。また、分割対象の文字列の最後に区切り文字が1つ以上あると、その部分は単に切り捨てられる。

2つ目の引数に -1 を与えると、最後に区切り文字があってもちゃんとそれも区切ってくれる。

String str = "abc,def,ghi,,";
String[] arr;

arr = str.split(",");
for (int i = 0; i < arr.length; i++) {
    System.out.println(i + ": " + arr[i]);
}
// 出力結果
// 0: abc
// 1: def
// 2: ghi

arr = str.split(",", -1);
for (int i = 0; i < arr.length; i++) {
    System.out.println(i + ": " + arr[i]);
}
// 出力結果
// 0: abc
// 1: def
// 2: ghi
// 3:
// 4:

パターンは正規表現で指定できる。 Java7以降では、正規表現で意味のある記号類以外の普通の1文字を指定した場合には、正規表現で処理せずに、高速な分割処理がなされるらしい。

Java 7 時代の String#split() 事情
http://blog.k11i.biz/2013/05/java-7-stringsplit.html

Scala

Signature:

いずれのメソッドも空文字列をsplitすると空文字列1つだけの配列を返す。また、分割対象の文字列の最後に区切り文字が1つ以上あると、その部分は単に切り捨てられる。

scala.collection.immutable.StringLike にあるChar型で分割文字列を指定するメソッドも、結局は中で正規表現にされて、java.lang.String#split が呼び出される。

PHP

$arr = explode($separator, $str);
# または
$arr = explode($separator, $str, $limit);

$str に空文字列を与えると、空文字列だけの要素数1の配列が返される。

$str = "";
var_export(explode("\n", $str));
// 出力結果
// array (
//   0 => '',
// )

$str = "\n";
var_export(explode("\n", $str));
// 出力結果
// array (
//   0 => '',
//   1 => '',
// )

$str = "abc\ndef\n\nghi\n";
var_export(explode("\n", $str));
// 出力結果
// array (
//   0 => 'abc',
//   1 => 'def',
//   2 => '',
//   3 => 'ghi',
//   4 => '',
// )

正規表現でパターンマッチングして分割するにはpreg_split関数を使う。

$str = "abc,def ghi";
$arr = preg_split('/[,\s]/', $str);
var_export($arr);
// 出力結果
// array (
//   0 => 'abc',
//   1 => 'def',
//   2 => 'ghi',
// )

explode 関数 | PHP Manual
http://php.net/manual/ja/function.explode.php

preg_split 関数 | PHP Manual
http://php.net/manual/ja/function.preg-split.php

Python

lst = str.split(separator)

Python3での例

print(''.split(','))     # => ['']
print('a'.split(','))    # => ['a']
print(','.split(','))    # => ['', '']
print('a,,b'.split(',')) # => ['a', '', 'b']
print('a,'.split(','))   # => ['a', '']
print(',b'.split(','))   # => ['', 'b']

# 2文字以上のセパレータも設定できる
print("abcd".split("bc")) # => ['a', 'd']

Python2でも同じであった。

Rubyと違って、セパレータに空文字列を入れることはできず、入れるとエラーになってしまう。また、セパレータで終わっている文字列はちゃんと最後に空の文字列を要素として返してくれ、 Rubyのような余計なお世話がなくて、厳密に分割してくれるみたい。

Ruby

arr = str.split(pattern)
arr = str.split(pattern, limit)

pattern には文字列または正規表現を使える。 pattern に空文字列 '' を指定すると、1文字ずつに分割した配列を返す。

"abc".split('')
# => ["a", "b", "c"]

"".split(',')
# => []

"a".split(',')
# => ["a"]

",".split(',')
# => []

"a,,b".split(',')
# => ["a", "", "b"]

"a,".split(',')
# => ["a"]

",b".split(',')
# => ["", "b"]

Perl

split関数を使う。

my @arr = split(/[bd]/, "abcdef");
print "@arr";
# => a c ef

空文字列を与えると、要素のない配列を返す。

my @arr = split(/,/, "");
print scalar @arr;
# => 0

2つ目の引数を省略すると $_ を対象にsplitする。

1つ目の引数は正規表現なので、素の文字列で分割したい場合は quotemeta で正規表現に変換するとよい。

print quotemeta('$');
# 出力結果
# \$

my @arr = split(quotemeta('$'), 'a$b$c');
print Dumper \@arr;
# 出力結果
# $VAR1 = [
#           'a',
#           'b',
#           'c'
#     ];

その他の例

my @arr = split(/,/, "a,");
print Dumper \@arr;
# => ['a']

my @arr = split(/,/, ",b");
print Dumper \@arr;
# => ['', 'b']

split 関数 | perldoc.jp
http://perldoc.jp/func/split

quotemeta 関数 | perldoc.jp
http://perldoc.jp/func/quotemeta

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。