文字列を特定の文字やパターンで配列に分割するには (explode / split) 2016/06/20
文字列を特定の区切り文字や正規表現で表すパターンで分割して配列を生成する方法の、プログラミング言語別メモ。
コマンドではsplit
というのもあるが、このコマンドはパターンではなく一定のサイズごとにファイルを分割する。
Go言語 | strings.Split(str, ",") |
Java | str.split(",") |
Scala | str.split(",") |
PHP | explode(",", $str) |
Python | str.split(",") |
Ruby | str.split(",") |
Perl | split(/,/, $str) |
関連
Go言語 2015/02/09
例
import "strings"
var arr []string
arr = strings.Split(str, ",")
Java 2016/07/04
Signature:
String[] java.lang.String#split(String regex)
String[] java.lang.String#split(String regex, int limit)
空文字列を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 2014/10/31
Signature:
def StringLike#split(separator: Char): Array[String]
def StringLike#split(separators: Array[Char]): Array[String]
def String#split(regex: String): Array[String]
def String#split(regex: String, limit: Int): Array[String]
いずれのメソッドも空文字列をsplitすると空文字列1つだけの配列を返す。また、分割対象の文字列の最後に区切り文字が1つ以上あると、その部分は単に切り捨てられる。
scala.collection.immutable.StringLike
にあるChar
型で分割文字列を指定するメソッドも、結局は中で正規表現にされて、java.lang.String#split
が呼び出される。
PHP 2017/04/24
例
$arr = explode($separator, $str);
# または
$arr = explode($separator, $str, $limit);
最後に区切り文字があってもちゃんとそれも区切ってくれる。
$str = "abc,def,ghi,,";
var_export(explode(",", $str)); echo "\n";
// 出力結果
// array (
// 0 => 'abc',
// 1 => 'def',
// 2 => 'ghi',
// 3 => '',
// 4 => '',
// )
$str
に空文字列を与えると、空文字列だけの要素数1の配列が返される。
$str = "";
var_export(explode("\n", $str));
// 出力結果
// array (
// 0 => '',
// )
$str = "\n";
var_export(explode("\n", $str));
// 出力結果
// array (
// 0 => '',
// 1 => '',
// )
正規表現でパターンマッチングして分割するには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 2014/09/17
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 2013/11/15
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 2015/05/18
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