55
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-03

編集履歴

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

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

55
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?