好的,所以我希望NSRegularExpression
找到并替换方法来编辑Swift中的String
,但是我不能直接将它传递给这些&作为& #39; s不被视为NSMutableString
类型,即使是通过var
声明(启用了String
的变异方法)。
所以到目前为止我唯一的解决方法是:
var theString = "foo bar"
let theExpression = NSRegularExpression(pattern: "f..", options: nil, error: nil)!
var theStringWithReplacements = NSMutableString()
theStringWithReplacements.appendString(theString)
theExpression.replaceMatchesInString(theStringWithReplacements, options: nil, range: NSMakeRange(0, theStringWithReplacements.length))
theString = theStringWithReplacements
这适用于较小的字符串,但我担心它会因为真正的大块文本而变得很棒,而我更喜欢修改一个正确可变的字符串,而不是通过可变副本。
是否可以直接使用Swift String,或者我暂时使用NSMutableString
副本,或者在我需要的地方完全使用它们?
我唯一的另一种选择似乎是使用theExpression.matchesInString()
并使用它提供的范围执行替换,转换为与theString.replaceRange()
一起使用。
答案 0 :(得分:0)
这个版本适用于Swift 2.2 Foundation / Cocoa笨拙,在Swift 3.0 +中应该更好:
do {
let theExpression = try NSRegularExpression(pattern: "f..", options: NSRegularExpressionOptions(rawValue: 0))
let mutableStr = theStringWithReplacements.mutableCopy() as! NSMutableString
if theExpression.replaceMatchesInString(mutableStr, options: NSMatchingOptions(rawValue: 0), range: NSRangeFromString(theStringWithReplacements), withTemplate: "your new string here") > 0 {
// success
theStringWithReplacements = tmp as String
} else {
// failed: regex didn't match
}
} catch {
// ignored: NSRegularExpression regex pattern assumed to be correct
}
可能更容易使用stringByReplacingMatchesInString
do {
let theExpression = try NSRegularExpression(pattern: "f..", options: NSRegularExpressionOptions(rawValue: 0))
theStringWithReplacements = theExpression.stringByReplacingMatchesInString(theStringWithReplacements, options: NSMatchingOptions(rawValue: 0), range: NSRangeFromString(theStringWithReplacements), withTemplate: "your new string here")
} catch {
// ignored: NSRegularExpression regex pattern assumed to be correct
}
加分:这是一个字符串扩展,使正则表达式更容易一些(匹配类似)
import Foundation
extension String {
// returns nil if pattern is bad, or a copy of self with any replacements
func replaceMatches(pattern: String, regexOptions: NSRegularExpressionOptions = NSRegularExpressionOptions(rawValue: 0), matchOptions: NSMatchingOptions = NSMatchingOptions(rawValue: 0), range: NSRange! = nil, template: String) -> String! {
do {
let regex = try NSRegularExpression(pattern: pattern, options: regexOptions)
return regex.stringByReplacingMatchesInString(self, options: matchOptions , range: range ?? NSRangeFromString(self), withTemplate: template)
} catch {
return nil
}
}
}
答案 1 :(得分:0)
由于你没有正则表达式选项,我能想到的最简单的是:
xml
当然,这在技术上与后台的theString.stringByReplacingOccurencesOfString("f..", withString: "goo", options:.RegularExpressionSearch, range: nil)
桥接,Apple可能会在幕后转换为NSString
。纯Swift(如不导入NSMutableString
),标准库中没有任何内容。