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

  • 17
    いいね
  • 0
    コメント

編集履歴

2016年12月5日に以下を修正

  • 探索する文字列に絵文字が含まれていた場合、 上手く「置換」されなかった事に気付き、修正しました。
  • 「探索結果」についてサブパターンに対応できていなかった事に気付き、修正しました。

投稿前によく確認できずに申し訳ございませんでした。

はじめに

こんにちは。
メソッドがどんどん変わっていったり、
Swiftの正規表現って苦手で困ってしまったので、
文字列の基本的な操作である「検索」と「置換」を行うStringExtensionを書いてみました。
探索の結果を利用する部分をPHPのpreg_matchに似せて書きたかったのですが、
少し違うかもしれません...ごめんなさい。
至らぬ点など多々あると思いますが、コメントなど頂けたら幸いです。

サンプル

探索

sample.swift
var text = "Swwwwift"

if text.pregMatche(pattern: "Sw*ift"){
    print("マッチしました")
}else{
    print("マッチしていません")
}

preg_match.png


探索の結果

sample.swift
var text = "Swwwwift"
var ans: [String] = []
if text.pregMatche(pattern: "S(w+)ift", matches: &ans) {
    print("マッチしました")
}else {
    print("マッチしていません")
}
print(ans)

スクリーンショット 2016-12-31 3.54.51.png


置換

sample.swift
var text = "SwwwwiftLove"
let ans = text.pregReplace(pattern: "Sw*ift", with: "")
print(ans)

preg_replace.png


ソースコード

関数名など、ご自由に変更してください

StringExt.swift
import Foundation

extension String {
    //絵文字など(2文字分)も含めた文字数を返します
    var count: Int {
        let string_NS = self as NSString
        return string_NS.length
    }

    //正規表現の検索をします
    func pregMatche(pattern: String, options: NSRegularExpression.Options = []) -> Bool {
        guard let regex = try? NSRegularExpression(pattern: pattern, options: options) else {
            return false
        }
        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)
    }
}

参考にさせていただいた記事

Swiftの正規表現について

Swift (2.1)で一通り正規表現を触ってみた Qiita

Swiftの正規表現の例

Swift 正規表現を使って指定した<img srcを抽出したい。 teratail

見て頂いてありがとうございます。