Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@sdkei

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

More than 1 year has passed since last update.

まとめると

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だ。

さいごに

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

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

関連記事

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
sdkei
Kotlin かわいい。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?