swift

【swift3】正規表現で特殊文字を検索して置換する

正規表現で特殊文字を検索して置換します。



環境
・MacBook Air macOS Sierra version 10.12.6
・Xcode version 8.3.3
・Swift version 3.1

仕様
文字列に特殊文字やスペースなどが入って入れば削除置換する
例で以下のプログラムを実行すると「\\.^~@:あ \\\\[い \\*\\+う\\?え&\\]お\”_,=か\\{<>き\\}く#%\\(け\\)こ’!」が「あいうえおかきくけこ」と出力される

参考資料
正規表現による文字列の抽出(Swift) [NSRegularExpression, NSTextCheckingResult] iOS Objective-C, Swift Tips-モバイル開発系(K)
正規表現による文字列の抽出(Swift) [NSRegularExpression, NSTextCheckingResult] iOS Objective-C, Swift Tips-モバイル開発系(K)

NumberFilter.swift
https://github.com/codefirst/FlickSKK/blob/master/Common/NumberFilter.swift

準備
なし

ViewController.swift

import UIKit
import Foundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let str :NSMutableString = "\\.^~@:あ \\\\[い \\*\\+う\\?え&\\]お\"_,=か\\{<>き\\}く#%\\(け\\)こ'!"
        
        let regular : NSRegularExpression! = try? NSRegularExpression(pattern: "[\\\\\\*\\+\\.\\?\\{\\}\\(\\)\\[\\]$\\-\\|\\/^~@:;<>`#%&'!\"_,=  ]", options: [])
        
        //\*+.?{}()[]$-|/半角スペース・全角スペースが入っていたとき
        if let _ = regular.firstMatch(in: str as String, options: [], range: NSMakeRange(0, str.length)) {

            //置換
            regular.replaceMatches(in: str, options: [], range: NSMakeRange(0, str.length), withTemplate: "")
        }
        print(str)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

githubにコードがあります。




余談
変数strをNSMutableStringではなくStringで宣言して修正した場合、以下のようなエラーが出ました。
おそらくreplaceMatchesの第一引数inでNSMutableStringへ型変換しているのがダメっぽいようです。
なぜかはわかりませんでした。


Stringで修正したもの
        let str :String = "\\.^~@:あ \\\\[い \\*\\+う\\?え&\\]お\"_,=か\\{<>き\\}く#%\\(け\\)こ'!"
        
        let regular : NSRegularExpression! = try? NSRegularExpression(pattern: "[\\\\\\*\\+\\.\\?\\{\\}\\(\\)\\[\\]$\\-\\|\\/^~@:;<>`#%&'!\"_,=  ]", options: [])
        
        //\*+.?{}()[]$-|/半角スペース・全角スペースが入っていたとき
        if let _ = regular.firstMatch(in: str, options: [], range: NSMakeRange(0, str.characters.count)) {

            //置換
            regular.replaceMatches(in: str as! NSMutableString, options: [], range: NSMakeRange(0, str.characters.count), withTemplate: "")
        }
        print(str)
    }


エラー文
** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[Swift._NSContiguousString replaceCharactersInRange:withString:]: unrecognized selector sent to instance 0x6080000477d0’
*** First throw call stack:
・・・・省略・・・・
libc++abi.dylib: terminating with uncaught exception of type NSException

関連記事

  1. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ⑥確認する

    目次①プロジェクトを作成②Storyboardにパーツを配置、…

  2. swift

    【swift3.0】MPVolumeView 縦スライダー操作中にシステム音量を表示させずに音量を変…

    縦スライダー操作中にシステム音量を表示させずに音量を変更させます。…

  3. swift

    【swift3.0】MIDIファイルを再生させる

    swift3.0でMIDIファイルを再生させます。…

  4. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ~目次~

    カレンダーを表示するシンプルなアプリを作ります。G…

  5. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ⑤プログラムを書く

    カレンダーを表示するシンプルなアプリを作ります。目次①プロ…

  6. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ③IBOutlet、IBAction…

    カレンダーを表示するシンプルなアプリを作ります。目次①プロ…

カテゴリー

おすすめ記事

アーカイブ

PAGE TOP