特定のインデックスの文字を取得するには (charAt / getAt)

インデックスを指定してその場所の1文字を取得する方法。文字列と文字(char)が別のデータ型の言語の場合は、文字(char)として取得できる。文字(char)のデータ型が存在しない言語の場合は、1文字の文字列として取得するできる。

インデックスで範囲を指定して部分文字列を取得する方法はsubstr参照。

Java

0から始まるインデックスで char の文字を取得できる。

char はUTF-16の16ビットでの値なので、サロゲートペアの文字が含まれていた場合、インデックスが文字単位のインデックスとは一致しないし、サロゲートペアの文字に直撃した場合はその1バイト目または2バイト目のみの取得になってしまう。

Signature:

java.lang.String だけでなく java.lang.StringBuilderjava.lang.StringBuffer でも同様に使える。

文字列(java.lang.String)はイミュータブルなので、文字を取得できるのみで、書き換えることはできない。

Scala

Javaと同じく、0から始まるインデックスで Char の文字を取得できる。

char はUTF-16の16ビットでの値なので、サロゲートペアの文字が含まれていた場合、インデックスが文字単位のインデックスとは一致しないし、サロゲートペアの文字に直撃した場合はその1バイト目または2バイト目のみの取得になってしまう。

Signature:

applyメソッドが定義されているので、str(2) のように配列の要素へのアクセスと同じように文字を取得できる。

StringLike#apply は内部ではJavaの String#charAt を呼び出している。

"abc"(2) // => 'c'

文字列(java.lang.String)はイミュータブルなので、文字を取得できるのみで、書き換えることはできない。

Groovy

Javaと同じく、0から始まるインデックスで Char の文字を取得できる。

char はUTF-16の16ビットでの値なので、サロゲートペアの文字が含まれていた場合、インデックスが文字単位のインデックスとは一致しないし、サロゲートペアの文字に直撃した場合はその1バイト目または2バイト目のみの取得になってしまう。

Signature:

// java.lang.String
char charAt(int index)
String getAt(int index)

JavaにはないメソッドとしてgetAtメソッドが定義されており、 Groovyの演算子オーバーロードにより str[2] のように配列の要素へのアクセスと同じように文字を取得できる。

getAtでは負を指定すると、後ろから数えてくれる。

charAtgetAtも範囲外のインデックスを指定すると java.lang.StringIndexOutOfBoundsException がスローされる。妥当な範囲は charAt では 0 から str.length - 1 まで、 getAt では -str.length から str.length - 1 までである。

java.lang.String#getAt | Groovy JDK API Documentation
http://beta.groovy-lang.org/docs/latest/html/groovy-jdk/java/lang/String.html#getAt(int)

PHP

[]演算子で0から始まるインデックスで文字を取得できる。

$str[$index];

PHP文字というデータ型はないので、取得した結果も1文字ではあるものの文字列である。従って以下のようなことになる。

$str = "abc";
echo $str[0]; // => a
echo $str[0][0]; // => a
echo $str[0][0][0]; // => a

ただしこれはPHP 5.4以降の話で、 PHP 5.3までだとなぜか $str[0][0] からはエラーになる。 $str[0] が文字列なのは同じなので、なぜだろう?

PHP 5.4までは文字列リテラルに直接 [] でアクセスすることができない。

echo "abc"[1];

このコードをPHP 5.4以前で実行すると PHP Parse error: syntax error, unexpected '[' というエラーになる。

Javaなどと同様の感覚で文字を文字コードの数値として取得するには

ord($str[$index])

のようにordを使う。ただし、これは文字コードに関係なくバイト単位になるので、仮名や漢字などのマルチバイト文字の場合には取り扱いに注意が必要。

Python

文字列の中の文字は、リストやタプルから要素を取得するのと同じように [] でアクセスできる。

str[index]

文字というデータ型はないので、取得した結果も文字列である。

文字列はイミュータブルなので、文字を書き換えることはできない。

文字列の中の最後の文字を取得する例

str[-1]

Ruby

文字列の中の文字は、配列から要素を取得するのと同じように [] でアクセスできる。

文字というデータ型はないので、取得した結果も文字列である。

str = "abcあいう"

p str[0] # => "a"
p str[4] # => "い"
p str[4].class # => String

文字を書き換えることもできる。しかも1文字を2文字以上に置き換えることもできる。

str = "abcあいう"
str[4] = "II"
p str # => abcあIIう

Perl

use utf8;

my $s = "あいうえお";
print substr($s, 2, 1);
# => う

use utf8; がないと、ASCII以外の文字を正しく扱えない。

文字というデータ型はないので、取得した結果も文字列である。その文字のコードを整数で取得したい場合は ord を使う。

JavaScript

str[index]

インデックスは0から始まる。

範囲外のインデックスを指定すると undefined が返される。

charCodeAt というメソッドだと文字をコードポイントで取得できる。ただし、サロゲートペアには対応していない。

CoffeeScript

str[index]

インデックスは0から始まる。

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