Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

編集履歴

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

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

2017年11月12日に以下を修正

  • Swift4.0によるStringクラスによる「count」プロパティの変更

はじめに

こんにちは。
メソッドがどんどん変わっていったり、
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 length: 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.length))
        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.length)
        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].range(at: 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.length), withTemplate: with)
    }
}

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

Swiftの正規表現について

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

Swiftの正規表現の例

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

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

KikurageChan
見て頂いてありがとうございます。
https://kikuragechan.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away