LoginSignup
52
42

More than 5 years have passed since last update.

String.Indexを使った文字列処理

Last updated at Posted at 2015-02-22

String.Index

Stringの中のそれぞれの文字(Character型)にアクセスするにはString.Index型の値を使用する。
StringはCharacterの双方向リストで構成されており、ランダムアクセスはに時間がかかる。

Indexを取得する

文字列からそのIndexを取得する場合は、まずstartIndexもしくはendIndexプロパティで最初か最後のIndexを取得する。

n番目のIndexを文字列から直接取得することはできない

let str = "ABCDEF"
let startIndex = str.startIndex // 文字列の最初のIndexを取得
let endIndex = str.endIndex     // 文字列中の最後のIndexを取得

Indexを進める、戻る

文字列からn番目のIndexを直接取得することはできず、startIndex/endIndexから順々に辿って目的のIndexを得る。

Indexを次に進める/一つ前に戻る

let str = "ABCDEF"
let startIndex = str.startIndex
let nextIndex = startIndex.successor()    // 次のIndexを取得する
let startIndex2 = nextIndex.predecessor() // 一つ前のIndexを取得する

n個先のIndexを取得する

advance()という関数を使う

let str = "ABCDEF"
let startIndex = str.startIndex
let idx4 = advance(startIndex, 4) // startIndexから3つ先にすすめる

Indexから文字を取得

Indexを使って以下のように対応する文字を取得することができる

let str = "ABC"
let idx0 = str.startIndex
let idx1 = idx0.successor()
let idx2 = idx1.successor()
str[idx0] // => 'A' Character型
str[idx1] // => 'B' Character型
srt[idx2] // => 'C' Character型

またfor文を使って文字をIterateすることもできる

let str = "ABC"
for s in str{
    println("s \(s)")
}
//結果
//s A
//s B
//s C

部分文字列を取得

Stringから部分文字列を取得するメソッドは以下が用意されている

    // index位置(を含む)から文字列の最後までの部分文字列を返す
    func substringFromIndex(index: String.Index) -> String

    // 文字列のはじめからindex位置の前までの部分文字列を返す
    // index位置の文字は含まない
    func substringToIndex(index: String.Index) -> String

    // 与えられたindexの範囲の部分文字列を返す
    func substringWithRange(aRange: Range<String.Index>) -> String

使用例

let str = "ABC"
let idx0 = str.startIndex
let idx1 = idx0.successor()
let idx2 = idx1.successor()

str.substringFromIndex(idx1) // => "BC"
str.substringToIndex(idx2)   // => "AB"

// idx1は含むがidx2は含まれない
str.substringWithRange(Range(start: idx1, end: idx2)) // => "B"

// idx1もidx2も両方含まれる
str.substringWithRange(idx1...idx2) // => "BC"

// idx1は含むがidx2は含まれない
str.substringWithRange(idx1..<idx2) // => "B"

// str.substringWithRange(idx1..idx2) => コンパイルエラー(半閉空間の指定の演算子は..<)


52
42
2

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
52
42