Swift の String(文字列)の切り出し - Substring
String クラスに文字を切り出す時に使える Substring という名前のメソッドがあるプログラミング言語がありますが、Swift には Substring というデータ型はありますが、Substring というメソッドはありません。
ここでは Swift の String(文字列)から文字を切り出す方法についてご説明します。
Swift で文字列の前から指定した文字数を切り出す
Swift で文字列の前から指定した文字数を切り出したい時には、prefix() メソッドが使えます。
引数に文字数を渡すと、前からその文字数分の Substring が返ります。
引数に指定した文字数が元の文字列の文字数より多い時もエラーにはならず、その時は元の文字列全部が返ります。
引数にマイナスの値を指定するとエラーになります。
戻り値の Substring は元の文字列をポイントしたものなので、そこから新しい文字列を生成したい時は String のコンストラクタに Substring を渡して String を生成します。
それでは、prefix() メソッドを使って、文字列の前から 5 文字を切り出してみます。
let s1 = "ABCDEFGHIJKLMN"
let sub1 = String(s1.prefix(5))
print(sub1)
let s2 = "ABC"
let sub2 = String(s2.prefix(5))
print(sub2)
実行結果は次のようになり、前から 5 文字ある時は 5 文字、ない時は最後の文字までが切り出されています。
ABCDE
ABC
Swift で文字列の後ろから指定した文字数を切り出す
Swift で文字列の前から指定した文字数を切り出したい時には、suffix() メソッドが使えます。
前後が違うだけで、prefix() メソッドと同じように使えます。
suffix() メソッドを使って、文字列の後ろから 5 文字を切り出してみます。
let s1 = "ABCDEFGHIJKLMN"
let sub1 = String(s1.suffix(5))
print(sub1)
let s2 = "ABC"
let sub2 = String(s2.suffix(5))
print(sub2)
実行結果は次のようになり、後ろから 5 文字切り出されています。
JKLMN
ABC
Swift で文字列から指定した位置の文字を切り出す
他のプログラミング言語の Substring メソッドでは、開始のインデックスを指定して、それ以降の文字を切り出したりできますね。
また、開始・終了のインデックスや、開始のインデックスと長さを指定して文字列を切り出したりできると思います。
Swift には同じような Substring メソッドがありません。
文字を切り出すには、いろんな方法があるかと思いますが、ここでは、開始のインデックスなどを指定して文字を切り出す時に使えるサンプルコードをご紹介します。
Swift で文字の開始位置を指定して切り出す
まずは、Swift で文字の開始位置を指定して切り出すサンプルコードです。
例えば、開始のインデックスを 3 に指定して文字列を切り出すには次のようにできます。
let s = "ABCDEFGHIJKLMN"
let start = 3
let startIdx = s.index(s.startIndex, offsetBy: start, limitedBy: s.endIndex) ?? s.endIndex
let sub = String(s[startIdx...])
print("sub = \(sub)")
4 行目で index() メソッドを使って、開始インデックスのポジションを示す String.Index を取得しています。
limitedBy はオプショナルの引数ですが、limitedBy を指定しないと、実在する index を超えた値を指定するとエラーになります。
limitedBy を指定すると、そのインデックス超えて検索しないので、実在する index を超えた値を指定してもエラーになりません。
その時は null が返るので、endIndex プロパティの値(最後のインデックス + 1 の位置の String.Index)が startIdx に入るようにしておきます。
そして、5 行目の s[startIdx...] で取得した startIdx から残り全部の文字の Substring を取得し、それを String のコンストラクタに渡して新しい String を生成しています。
このコードも prefix() のように start にマイナスの値を指定するとエラーになるのでご注意ください。limitedBy も指定せずに、最初に start が実在する index の範囲の値かチェックして希望の動きになるように処理してしまっても良いと思います。
実行結果は次のようになり、sub にインデックスが 3 の D 以降の文字列が取得できています。
sub = DEFGHIJKLMN
Swift で文字の開始と終了の位置を指定して切り出す
続いて、文字の開始と終了の位置を指定して、文字列を切り出すサンプルコードです。
例えば、開始と終了のインデックスを 3 と 6 に指定して文字列を切り出すには次のようにできます。
let s = "ABCDEFGHIJKLMN"
let start = 3
let end = 6
var sub = ""
if start > end {
sub = ""
} else {
let startIdx = s.index(s.startIndex, offsetBy: start, limitedBy: s.endIndex) ?? s.endIndex
let endIdx = s.index(s.startIndex, offsetBy: end + 1, limitedBy: s.endIndex) ?? s.endIndex
sub = String(s[startIdx..<endIdx])
}
print("sub = \(sub)")
開始のインデックスの String.Index を取得したのと同じように、終了のインデックスの String.Index も取得し Substring を取得して String に変換しています。
こちらも start がマイナスの時はエラーになりますので、必要であれば先にチェックして 0 に置き換えるなり処理してください。
実行結果は次のようになり、sub にインデックスが 3 ~ 6 の DEFG が取得できています。
sub = DEFG
以上、Swift の String(文字列)から文字を切り出す方法についてご説明しました。