2017-01-14 2 views
0

私はSwift 3で簡単なRegexを実行しようとしていて、入力文字列から数字を抽出しています。Swift 3の抽出グループをRegex - NSブリッジングの混乱から

私はiOSに精通していないので、かなりの難題であることが証明されています。私は間違いなく、StringNSStringの両方を同時に使用することに誤りがあると考えています。 「*** - [__ NSSingleObjectArrayI objectAtIndex:]:キャッチされない例外により 'NSRangeException'、理由にアプリを終了

は、次の例外で失敗

let url = "a5b" 
let nsUrl = url as NSString 

let regex = try! NSRegularExpression(pattern: "a(\\d)b", options: []) 
let matches = regex.matches(in: url, options: [], range: NSRange(location: 0, length: url.characters.count)) 

somestuff(str: nsUrl.substring(with: matches[1].range)) 
範囲外のインデックス1 [0 .. 0] '

数字を取得して取得する正しい方法は何ですか?

+2

と同じですこれはあなたの例のデータでは重要ではないかもしれないが、 'url.characters.count'はurl.utf16.count''に変更する必要があります。 'NSRegularExpression'は、UTF-16ベースの場所と長さを使用します。 – OOPer

答えて

2

インデックスはゼロベースですが、キャプチャグループは、あなたが...とにかくノー一致するmatches(inの戻り値について


をテストする必要があります範囲索引1

somestuff(str: nsUrl.substring(with: matches[0].rangeAt(1))) 

である:

NSTextCheckingResultの配列です。各結果は、そのrangeプロパティを介して全体の一致範囲と、rangeAt(_:)メソッドを使用して個々のキャプチャグループの範囲を示します。いずれかのキャプチャグループがこの特定のマッチに参加しなかった場合、範囲{NSNotFound, 0}が返されます。

注:rangeが実際にrangeAt(0)

+0

[0]は私にa5b(入力全体)を与えます。これはJavaと同じです。 – Zackline

+0

私は答えを更新しました。 – vadian

+0

ありがとうございます、これは、できるだけ早く受け入れます。なぜこれが必要なのか少し詳しくお聞きしたいですか?私は実際にAPIを理解していません。それはあなたに合致の配列を与えます、論理的に1つはマッチ[1]でキャプチャグループを見つけると予想します。なぜ「rangeAt」が「範囲が表す結果の型を返す」ということは、私には理解できないほど、キャプチャグループの範囲がわかります。 – Zackline