Swift中的可变字符串

时间:2015-01-29 22:33:18

标签: swift

好的,所以我希望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()一起使用。

2 个答案:

答案 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),标准库中没有任何内容。