要約
substring
関数などで部分文字列の範囲を指定するときは、
文字と文字の間に連番(文字列先頭からの距離)を振り、
その値で指定すると考えるとよい。
(この考え方だと文字列の長さも分かりやすい。)
おことわり
この記事では例を Java と JavaScript で書いていますが、ほとんどの言語・ライブラリーで概ね同じと思われます。
ただし、配列などのインデックスを1始まりで指定する言語の場合は異なるかもしれません。
substring
の引数をどう指定すればよいか、初心者には分かりにくい
ほとんどの言語の標準ライブラリーには、文字列からその一部(部分文字列)を切り出す関数が用意されているでしょう。
これは例えば文字列 "ABCD"
から 部分文字列 "BC"
を切り出すようなときに使います。
Java や JavaScript では substring
関数です。
次のようにして使います。
"ABCD".substring(1, 3); // -> "BC"
この関数は引数として切り出したい範囲の開始位置と終了位置を受け取ります。
しかし初心者にはこれをどう指定すればよいかが分かりにくいのではないでしょうか。
API ドキュメントには次のように書かれています。
- Java
-
- beginIndex
- 開始インデックス(この値を含む)。
- endIndex
- 終了インデックス(この値を含まない)。
- JavaScript(MDN)
-
- indexStart
- 返される部分文字列の、最初の文字を含んだ位置です。
- indexEnd
- 返される部分文字列から外される最初の文字の位置です。
はい、分かりませんね。
こう考えよう
次のように、文字と文字の間に番号を振ります。
|A|B|C|D|
0 1 2 3 4
いや、「番号」と考えると0始まりか1始まりかという余計なことを考えてしまいますね。
単に原点からの距離と考えましょう。
原点(先頭)は当然0です。
substring
関数の引数は、この値で指定します。
"ABCD"
から "BC"
を切り出すのであれば、
-
"B"
の直前の1
から -
"C"
の直後の3
まで
となります。
したがって次のように指定すればよいです。
"ABCD".substring(1, 3); // -> "BC"
文字列の長さ
ちなみに、「距離」と考えると、文字列の長さも分かりやすいです。
|A|B|C|D|
0 1 2 3 4
文字列 "ABCD"
の長さは4です。
"ABCD".substring(1, 3)
で切り出した文字列の長さは 3 - 1
で2です。
さいごに
もしテキストエディターのようなものを作ることになった場合、文字の範囲選択の始点・終点やキャレット位置は同じように考えるとよいです。
なお、この記事では話の焦点を絞るために文字列にのみ触れましたが、
配列などについても同様に考えましょう。
関連記事
/以上