朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら 
Swift 正規表現を使った時に置換回数の制御の方法





私はSwiftにおいて、正規表現のメソッドで置換の回数を指定して置換できるものを見つけれてないのでトリッキーな方法でしています。
NSRegularExpressionのメソッドのfirstMatch(in:options:range:)で最初にマッチするものを見つけて、マッチした場所の文字列を抜き出しStringのreplacingOccurences(of:with:)で置換させています。
何故正規表現のmatchesで一度にマッチするものを取得してやらないのかというと、置換を一度すると文字列が変わってしまうため他のマッチしたrangeも変わってしまうため一つずつしないといけないのです。
Stringクラスの置換で行うと全く同じ文字列があった場合、一度に複数個の置換が行われるのでこの方法ではうまくいきません。

            //置換したい文字列の正規表現を作成
            let regex = try! NSRegularExpression(pattern: escapeString, options: .caseInsensitive)
            for var i in 0 ..< myList[u]! {
                let match = regex.firstMatch(in: myString, options: [], range: NSMakeRange(0, (myString as NSString).length))
                if match != nil {
                    if i == 0 {
                        //ここでは一回目は置換しないでいます。
                        i += 1
                        continue
                    } else {
                        //二回目以降を置換しています。
                        //マッチした文字列を取得して、その文字列と一致する場所をStringクラスの置換処理で置換しています。
                        let r1 = match!.range(at: 0)
                        targetStringForReplace = (myString as NSString).substring(with: r1)
                            
                        myString = myString.replacingOccurrences(of: targetStringForReplace, with: "")
                        i += 1
                    }
                }
            }

        








良いやや良い普通やや悪い悪い

投稿日時評価コメント