2

背景:我来自 15-20 年的 JavaScript、Ruby 和(现代)PHP。去年我一直在研究 Swift,而且我对 Cocoa 是全新的。

这是我在 Xcode 7.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:]: Range or索引超出范围'

我查看了以下文档,但没有任何东西跳出来给我:

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

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

4

3 回答 3

2

我看到 stringByReplacingMatchesInString 的第一个参数是“替换”。这应该是“自我”吗?

于 2015-06-25T06:49:59.813 回答
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)
于 2015-06-25T07:19:36.243 回答
0

也许:

   Return regex.stringByReplacingMatchesInString{
        MainstringYouWantToReplaceSomethinIn,
        options: [.Anchored],
        range: NSMakeRange(0,self.MainstringYouWantToReplaceSomethinIn.count - 1),
        withTemplate: "xx"
    )
}
}
于 2015-06-25T07:44:52.120 回答