Edited at

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

More than 1 year has 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


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