34
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【言語不問(?)】substring の考え方(文字列の範囲)

Last updated at Posted at 2019-04-06

要約

substring 関数などで部分文字列の範囲を指定するときは、
文字と文字の間に連番(文字列先頭からの距離)を振り、
その値で指定すると考えるとよい。
(この考え方だと文字列の長さも分かりやすい。)


おことわり

この記事では例を Java と JavaScript で書いていますが、ほとんどの言語・ライブラリーで概ね同じと思われます。
ただし、配列などのインデックスを1始まりで指定する言語の場合は異なるかもしれません。

substring の引数をどう指定すればよいか、初心者には分かりにくい

ほとんどの言語の標準ライブラリーには、文字列からその一部(部分文字列)を切り出す関数が用意されているでしょう。
これは例えば文字列 "ABCD" から 部分文字列 "BC" を切り出すようなときに使います。

JavaJavaScript では 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です。

さいごに

もしテキストエディターのようなものを作ることになった場合、文字の範囲選択の始点・終点やキャレット位置は同じように考えるとよいです。

なお、この記事では話の焦点を絞るために文字列にのみ触れましたが、
配列などについても同様に考えましょう。

関連記事

/以上

34
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?