Swift2.0で正規表現
Swiftで正規表現扱うときどうやるんだろうと思って調べてるうち行き着いた先が「EasyRamble」さんの以下の記事です。 http://easyramble.com/swift-regular-expression-utility.html
ただSwift2.0になって少し変わっているようなので、手を加えました。
init
変更前
init(_ pattern: String) { self.pattern = pattern var error: NSError? self.internalRegexp = NSRegularExpression( pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive, error: &error)! }
変更後
NSRegularExpression
の引数にエラーが含まれなくなったようです。
なので以下のようにtry catchへ変更しました。
init(_ pattern: String) { self.pattern = pattern do { self.internalRegexp = try NSRegularExpression(pattern: pattern, options: []) } catch let error as NSError { print(error.localizedDescription) self.internalRegexp = NSRegularExpression() } }
isMatch
変更前
func isMatch(input: String) -> Bool { let matches = self.internalRegexp.matchesInString( input, options: nil, range:NSMakeRange(0, count(input)) ) return matches.count > 0 }
変更後
optionsの指定方法ぐらいですね。
func isMatch(input: String) -> Bool { let nsString = input as NSString let matches = self.internalRegexp.matchesInString(input, options:[], range:NSMakeRange(0, nsString.length)) return matches.count > 0 }
matches
変更前
func matches(input: String) -> [String]? { if self.isMatch(input) { let matches = self.internalRegexp.matchesInString( input, options: nil, range:NSMakeRange(0, count(input)) ) var results: [String] = [] for i in 0 ..< matches.count { results.append( (input as NSString).substringWithRange(matches[i].range) ) } return results } return nil }
変更後
countの箇所でエラーが起きるので以下のように変更しています。
func matches(input: String) -> [String]? { if self.isMatch(input) { let nsString = input as NSString let matches = self.internalRegexp.matchesInString( input, options: [], range:NSMakeRange(0, nsString.length) ) var results: [String] = [] for i in 0 ..< matches.count { results.append( (input as NSString).substringWithRange(matches[i].range) ) } return results } return nil }
個人的に追加
正規表現で一致した内容を削るものです。
func delMatches(input:String) -> String { var strRet:String = "" if self.isMatch(input) { let matchList = self.matches(input) strRet = input for var i = 0; i < matchList!.count; i++ { strRet = strRet.stringByReplacingOccurrencesOfString(matchList![i], withString: "", options: [], range: nil) } } return strRet }
使い方
左側に正規表現を記載し、右側に対象の文字列を書きます。
Regexp("(\\d+)").delMatches(self._strTitle)
以上です。