正規表現
Swift

Swift (2.1)で一通り正規表現を触ってみた

More than 3 years have passed since last update.


Swift (2.1)で一通り正規表現を触ってみた


はじめに

Swiftは言語機能として正規表現をサポートしておらず、Objective-CからあるFoundationのNSRegularExpressionを利用することで正規表現の機能を使うことができます。

ですがSwift2からNSRegularExpressionはtrycatchで書かなければならなかったり、一致どうだっけ、置換どうだっけって毎回引っかかるので備忘録として基本的な機能の使い方を残します。


前提


開発環境


  • Xcode 7.2


言語


  • Swift 2.1


ライブラリ

import Foundation


NSRegularExpression


正規表現オブジェクトを生成

let regex: NSRegularExpression

do {
let pattern = 正規表現パターン
regex = try NSRegularExpression(pattern: pattern, options: [NSRegularExpressionOptions.{オプション}])
} catch let error as NSError {
// エラー処理
}


  • エラーとしてcatchのスコープにくるケースは以下


    • patternが空文字

    • pattern内のエスケープ文字が不適切(バックスラッシュなど)



  • オプションの細かい挙動については当ページのこちらを参照


正規表現による一致

let string = 検索対象文字列

let results: [NSTextCheckingResult] = regex.matchesInString(string, options: [], range: NSMakeRange(0, string.characters.count))

var matchStrings = [String]()
for (idx, result) in results.enumerate() {
let range = result.rangeAtIndex(idx)
if range.location != NSNotFound {
let matchString = (string as NSString).substringWithRange(range) as String
if !matchString.isEmpty {
matchStrings.append(matchString)
}
}
}

正規表現のパターンに一致する文字列を配列の形で取得する例です、ポイントとしては走査してるときにNSNotFoundがNSRangeのlocationの中に飛んでくるので、そこをちゃんと判定してあげる必要があります。


正規表現による置換

let string = 置換対象文字列

let replaceString = 置換文字列
let convertedString = regex.stringByReplacingMatchesInString(string, options: [], range: NSMakeRange(0, string.characters.count), withTemplate: replaceString)

print(convertedString) // -> 正規表現に一致する箇所を置換した文字列を出力

正規表現のパターンに一致する文字列をまとめて置換する例です。


NSRegularExpressionOptions


CaseInsensitive


  • 大文字・小文字の区別をしないようになる


AllowCommentsAndWhitespace


  • 以下の文字列を無視するようになる


    1. 空白

    2. #から始まるコメント




IgnoreMetacharacters


  • 正規表現のメタ文字を無視するようになる


DotMatchesLineSeparators


  • 処理対象の文字列の改行文字列(\n)を.として認識するようになる


AnchorsMatchLines


  • 1行ごとに^一致、$一致を判定してくれるようになる


UseUnixLineSeparators


  • Unixの改行コードである\nのみを改行コードとして扱うようになる


UseUnicodeWordBoundaries


  • Use Unicode TR#29 to specify word boundaries (otherwise, traditional regular expression word boundaries are used).

よく把握してないのでドキュメントの英語そのまま載せておきます