上下文:我来自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 。
答案 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"
)
}
}