- 更新日: 2015年9月10日
- Swift & iOS
Swiftで正規表現を使いやすくするユーティリティ・クラスを作った
Swift で正規表現を使おうとしたところ、CoreData と同様これまた若干使いにくい…。普段 Ruby で正規表現処理のコードを書いていると、Swift での正規表現の処理が若干冗長に感じられました。
— 環境 —
Xcode 6.3.2
Swift 1.2
playground で Swift の正規表現処理を確認
普通に、文字列が正規表現のパターンにマッチするか調べたり、マッチした部分を抽出するコードです。Xcode の playgroung で動作確認しました。
1 2 3 4 5 6 7 8 9 10 11 12 |
> let hello: String = "Hello Swift!" > let pattern = "[a-zA-Z]+" > let regexp = NSRegularExpression( pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive, error: nil ) > let matches = regexp?.matchesInString( hello, options: nil, range:NSMakeRange(0, count(hello) ) ) > matches?[0].range // => (0,5) > matches?[1].range // => (6,5) > let first = (hello as NSString).substringWithRange(matches![0].range) // => "Hello" > let second = (hello as NSString).substringWithRange(matches![1].range) // => "Swift" |
NSRegularExpression で正規表現オブジェクトを生成し、matchesInString() メソッドでマッチ部のオブジェクトを配列(Array)で取得できます。そして、NSString#substringWithRange() メソッドに、文字列でマッチした範囲の Range オブジェクトを渡して、マッチ部分の文字列を取得します。
一連の処理の書き方が少々冗長で、何度も繰り返し書きたくない感じです。ということで、少々雑ではありますけど、直感的に Swift で正規表現を使えるようにするユーティリティなクラス(ライブラリ)を作成しました。
Swift で正規表現を処理するユーティリティ
とりあえず最低限の上記の例でも書いた、「マッチするかどうか判定」「マッチした文字列を抽出」の処理を行う2種類のメソッドを作りました。それぞれ、Regexp#isMatch(), Regexp#matches() メソッドに相当します。他にも必要な処理が出てきたらメソッドを追加していこうと思います。
Regexp.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import Foundation class Regexp { let internalRegexp: NSRegularExpression let pattern: String init(_ pattern: String) { self.pattern = pattern var error: NSError? self.internalRegexp = NSRegularExpression( pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive, error: &error)! } func isMatch(input: String) -> Bool { let matches = self.internalRegexp.matchesInString( input, options: nil, range:NSMakeRange(0, count(input)) ) return matches.count > 0 } func matches(input: String) -> [String]? { if self.isMatch(input) { let matches = self.internalRegexp.matchesInString( input, options: nil, range:NSMakeRange(0, count(input)) ) var results: [String] = [] for i in 0 ..< matches.count { results.append( (input as NSString).substringWithRange(matches[i].range) ) } return results } return nil } } |
Swift utility class for regular expression
使い方は以下のとおり。
1 2 3 4 5 6 7 8 9 10 |
let hello: String = "Hello Swift!" let pattern = "[a-zA-Z]+" Regexp(pattern).isMatch(hello) // => true Regexp(pattern).matches(hello) // => ["Hello", "Swift"] Regexp("[0-9]+").isMatch(hello) // => false Regexp("[0-9]+").matches(hello) // => nil |
これでかなり簡単に Swift で正規表現のコードが書けるようになりました。もう少しリファクタリングが必要かとは思いますけど。このユーティリティな正規表現クラスは、以下リンクの記事を参考にして作成しました。多謝。
- Swift & iOS の関連記事
- WKWebView/UIWebViewでウェブページが真っ白
- Unityのインストールと初期設定
- WKWebView/UIWebViewでNavigation Barの下にウェブページが隠れるのを回避
- SwiftでArray(配列)などをシャッフル
- Navigation Controllerで画面遷移させるSwiftコード
- Swiftでタップ/スワイプのイベント処理実装・UITapGestureRecognizerとUISwipeGestureRecognizer
- UIPageViewController画面下部のUIPageControlを非表示にする
- Swiftのバージョン確認・REPL実行
- Xcode7.0アップデートで遭遇した課題2つ
- 正規のXcodeかどうかチェック(XcodeGhostマルウェア騒動)
Leave Your Message!