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

# 編集履歴
**2016年12月5日に以下を修正**
> - 探索する文字列に絵文字が含まれていた場合、 上手く「置換」されなかった事に気付き、修正しました。
> - 「探索結果」についてサブパターンに対応できていなかった事に気付き、修正しました。

**2017年11月12日に以下を修正**
> - Swift4.0によるStringクラスによる「count」プロパティの変更

---

# はじめに
こんにちは。
メソッドがどんどん変わっていったり、
Swiftの正規表現って苦手で困ってしまったので、
文字列の基本的な操作である「検索」と「置換」を行うStringExtensionを書いてみました。
探索の結果を利用する部分をPHPの**preg_match**に似せて書きたかったのですが、
少し違うかもしれません...ごめんなさい。
至らぬ点など多々あると思いますが、コメントなど頂けたら幸いです。

# サンプル
## 探索
```swift:sample.swift
var text = "Swwwwift"

if text.pregMatche(pattern: "Sw*ift") {
    print("マッチしました")
} else {
    print("マッチしていません")
}
```
<img width="514" alt="preg_match.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/a3f627ca-cc86-af91-a434-bb55c4882a9f.png">

---
## 探索の結果
```swift:sample.swift
var text = "Swwwwift"
var ans: [String] = []
if text.pregMatche(pattern: "S(w+)ift", matches: &ans) {
    print("マッチしました")
} else {
    print("マッチしていません")
}
print(ans)
```
<img width="514" alt="スクリーンショット 2016-12-31 3.54.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/fb42e23e-497f-da4c-bbfd-d8ace203d681.png">

---

## 置換
```swift:sample.swift
var text = "SwwwwiftLove"
let ans = text.pregReplace(pattern: "Sw*ift", with: "")
print(ans)
```
<img width="514" alt="preg_replace.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/06cc444f-2d35-b9ab-8ee0-76427b2c6b92.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](http://qiita.com/moaible/items/85d80173bb8ed7f64b74)

Swiftの正規表現の例
> [Swift 正規表現を使って指定した<img srcを抽出したい。 teratail](https://teratail.com/questions/22476)

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