Swift 2.0:NSRangeException,Range或index超出范围

时间:2015-06-25 06:42:25

标签: swift nsregularexpression swift2 nsrangeexception

上下文:我来自15到20年的JavaScript,Ruby和(现代)PHP。去年我一直在盯着Swift,我对Cocoa来说是全新的。

这是一个简化的测试用例,我在Xcode7.0β2中运行:

#! /usr/bin/env swift

import Foundation

// Extend the String object with helpers
extension String {

    // String.replace(); similar to JavaScript's String.replace() and Ruby's String.gsub()
    func replace(pattern: String, replacement: String) -> String {

        // Debugging
        print(self.characters.count)
        print(NSMakeRange(0, self.characters.count - 1))

        let regex = try! NSRegularExpression(
            pattern: pattern,
            options: [.CaseInsensitive]
        )

        return regex.stringByReplacingMatchesInString(
            replacement,
            options: [.Anchored],
            range: NSMakeRange(0, self.characters.count - 1),
            withTemplate: "xx"
        )
    }
}

let prefix = "abc     123".replace("\\s+", replacement: " ")

print(prefix)

显示两条调试行:

11
(0,10)

之后,应用程序崩溃并显示以下消息:

  

2015-06-24 23:18:45.027 swift [42912:648900] ***由于未捕获的异常'NSRangeException'终止应用程序,原因:'*** - [NSRegularExpression enumerateMatchesInString:options:range:usingBlock:] :范围或索引越界'

我查看了以下文档,但没有任何内容向我发送:

我只能认为该问题与将NSRange实例作为参数传递给stringByReplacingMatchesInString()方法有关,但我尝试将值调整为NSRange(0,1)NSRange(1,2)希望看到某些会有所帮助,但它仍然会抛出异常。

正如我在标题中所写,我正在使用 Swift 2.0

3 个答案:

答案 0 :(得分:1)

我看到stringByReplacingMatchesInString的第一个参数是'replacement'。这应该是'自我'吗?

答案 1 :(得分:1)

在@Ben的回答之后,我感到愚蠢。这开始了一点点,我想出来了。这是代码。

#! /usr/bin/env swift

import Foundation

// Extend the String object with helpers
extension String {

    // String.replace(); similar to JavaScript's String.replace() and Ruby's String.gsub()
    func replace(pattern: String, replacement: String) -> String {

        let regex = try! NSRegularExpression(
            pattern: pattern,
            options: [.CaseInsensitive]
        )

        return regex.stringByReplacingMatchesInString(
            self,
            options: [.WithTransparentBounds],
            range: NSMakeRange(0, self.characters.count),
            withTemplate: replacement
        )
    }
}

let prefix = "abc     123".replace("(\\s+)", replacement: " ")

print(prefix)

答案 2 :(得分:0)

也许:

   Return regex.stringByReplacingMatchesInString{
        MainstringYouWantToReplaceSomethinIn,
        options: [.Anchored],
        range: NSMakeRange(0,self.MainstringYouWantToReplaceSomethinIn.count - 1),
        withTemplate: "xx"
    )
}
}