編集履歴
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("マッチしていません")
}
探索の結果
sample.swift
var text = "Swwwwift"
var ans: [String] = []
if text.pregMatche(pattern: "S(w+)ift", matches: &ans) {
print("マッチしました")
} else {
print("マッチしていません")
}
print(ans)
置換
sample.swift
var text = "SwwwwiftLove"
let ans = text.pregReplace(pattern: "Sw*ift", with: "")
print(ans)
ソースコード
関数名など、ご自由に変更してください
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の正規表現の例
見て頂いてありがとうございます。