茶漬けと玉子焼き

swiftとrubyの教室

Swiftで正規表現を使って文字列の操作を行う

Swiftで正規表現を使いたかったんだけど、調べて行くうちに、Swiftで正規表現ってなかなか面等らしく、どーしようかなと思っていると。
とても便利なStringExtensionを書いている方がいらっしゃたので、使わせていただきました。

Swift 3.0での基本的な正規表現を行うextension - Qiita


使用例

StringExtension

extension String {
    //絵文字など(2文字分)も含めた文字数を返します
    var count:Int{
        let string_NS = self as NSString
        return string_NS.length
    }
    
    //正規表現の検索をします
    func pregMatche(pattern: String, options: NSRegularExpression.Options = []) -> Bool {
        let regex = try! NSRegularExpression(pattern: pattern, options: options)
        let matches = regex.matches(in: self, options: [], range: NSMakeRange(0, self.count))
        return matches.count > 0
    }
    
    //正規表現の検索結果を利用できます
    func pregMatche(pattern: String, options: NSRegularExpression.Options = [], matches: inout [String]) -> Bool {
        guard let regex = try? NSRegularExpression(pattern: pattern, options: options) else {
            return false
        }
        let targetStringRange = NSRange(location: 0, length: self.count)
        let results = regex.matches(in: self, options: [], range: targetStringRange)
        for i in 0 ..< results.count{
            for j in 0 ..< results[i].numberOfRanges{
                let range = results[i].rangeAt(j)
                matches.append((self as NSString).substring(with: range))
            }
        }
        return results.count > 0
    }
    
    //正規表現の置換をします
    func pregReplace(pattern: String, with: String, options: NSRegularExpression.Options = []) -> String {
        let regex = try! NSRegularExpression(pattern: pattern, options: options)
        return regex.stringByReplacingMatches(in: self, options: [], range: NSMakeRange(0, self.count), withTemplate: with)
    }
}


実際に使うときはこんな感じ

var alphabet = "title=ABCDE&body=FGHIJ"

if alphabet.pregMatche(pattern: "ABCDE") {
    print("match")  // martch
}else{
    print("not match")
}

var hoge: [String] = []
_ = alphabet.pregMatche(pattern: "^title=.*&body", matches: &hoge)
print(hoge)  // ["title=ABCDE&body"]


let fuga = alphabet.pregReplace(pattern: "^title=.*&body", with: "title=abcde&body")
print(fuga)  // title=abcde&body=FGHIJ


Swift Extension 便利だ

Swift Extension を初めて意識して使ってみたんですが、なかなか便利、というか使える場面が多そうだなと思いました。
Swift Extension とは、

エクステンションとは拡張という意味ですが、読んで字の如く、エクステンションを使うと既存のクラスや構造体、列挙型に新たに機能を追加することができます。Objective-Cにもカテゴリーという、クラスを拡張する機能がありますがこれと似ています。

具体的には次のようなことができます。

・計算型プロパティと静的な計算型プロパティ(計算型の型プロパティ)を追加できます。
インスタンスメソッドと型メソッドを追加できます。
・イニシャライザを追加できます。(追加できるのはコンビニエンスイニシャライザのみです。指定イニシャライザやデイニシャライザは追加できません。)
・サブスクリプトを追加できます。
・ネストした型を定義してそれを使うことができます。
・新たなプロトコルに適合させることができます。

ということらしいです。

qiita.com

こちらにSwift Extension 集というのがありました。またこれから使う機会があれば使ってみようと思います。