編集履歴
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](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F128250%2Fa3f627ca-cc86-af91-a434-bb55c4882a9f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=45dfb56c3af62391f9521a78f36fb8e6)
探索の結果
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](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F128250%2Ffb42e23e-497f-da4c-bbfd-d8ace203d681.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ec09b1215f460b21001ee8744dee1f1f)
置換
sample.swift
var text = "SwwwwiftLove"
let ans = text.pregReplace(pattern: "Sw*ift", with: "")
print(ans)
![preg_replace.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F128250%2F06cc444f-2d35-b9ab-8ee0-76427b2c6b92.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6066e5a7d51f7aac249051cb980efe75)
ソースコード
関数名など、ご自由に変更してください
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の正規表現の例
見て頂いてありがとうございます。