如何在Swift中替换字符串中的特定单词?

3

我正在寻找一种在Swift中替换字符串中单词的方法。有人能帮忙吗?

目前我已经可以找到特定的单词,但是不知道如何替换它...

     var str = "helo, playgound"

     var findWords = ["helo","playgound"]
     var replaceWords = ["hello","playground"]

extension String {
    var wordList:[String] {
        return "".join(componentsSeparatedByCharactersInSet(NSCharacterSet.punctuationCharacterSet())).componentsSeparatedByString(" ")
    }
}

func stringToArray() -> Array<String> {
    var arr = str.wordList
    return arr
}

func correction(var _arr:Array<String>) -> String{

    for var i = 0; i < _arr.count; i++ {
            if str.lowercaseString.rangeOfString(findWords[i]) != nil {
                println("exists")
        }
      }
  return str
}
2个回答

4

这取决于你对“单词”的定义。如果你正在寻找一个智能的内置“单词”概念,最简单的解决方案可能是使用NSRegularExpression,它知道“单词”边界在哪里:

var s = NSMutableString(string:"hello world, go to hell")
let r = NSRegularExpression(
    pattern: "\\bhell\\b",
    options: .CaseInsensitive, error: nil)!
r.replaceMatchesInString(
    s, options: nil, range: NSMakeRange(0,s.length),
    withTemplate: "heaven")

之后,s 变成了 "hello world, go to heaven",这是正确的答案;我们替换了单词中的 "hell",但并没有替换 "hello" 中的 "hell"。请注意,我们还进行了不区分大小写的匹配,这似乎是您的要求之一。
这个示例展示了如何处理一个匹配对("hell" 和 "heaven"),但可以很容易地将其抽象为一个方法,以便您可以针对更多的匹配对再次使用它:
var str = "helo, playgound"

var findWords = ["helo", "playgound"]
var replaceWords = ["hello", "playground"]

func correct(str:String, orig:String, repl:String) -> String {
    var s = NSMutableString(string:str)
    let r = NSRegularExpression(
        pattern: "\\b\(orig)\\b",
        options: .CaseInsensitive, error: nil)!
    r.replaceMatchesInString(
        s, options: nil, range: NSMakeRange(0,s.length),
        withTemplate: repl)
    return s
}

for pair in Zip2(findWords,replaceWords) {
    str = correct(str, pair.0, pair.1)
}

str // hello, playground

谢谢您的答复!它帮了我很多!但我还有一个问题:是否可以println()替换了哪些单词?@马特 - b3rge
@b3rge 如果你还有问题,就“问”另一个问题吧!评论区不是提问的地方。 - matt

0

最简单的可能是这个:

let statement = "Swift is hard."
let swiftRange = statement.startIndex..<advance(statement.startIndex, 5)
let newStatement = statement.stringByReplacingCharactersInRange(swiftRange, withString: "Objective-C")
// now newStatement = "Objective-C is hard."

在更长的评论之后:上面是基于OP“我能找到具体的单词,但不知道如何替换它…”的假设,因此这不是关于查找“单词”,定义另一个讨论。只是关于替换已经找到的单词。

另外,有关stringByReplacingCharactersInRange的其他说明:@matt指出这是Cocoa交叉。在这种情况下,苹果公司正在说一个纯粹的谎言: enter image description here

我培养了网络,但没有苹果的消息。只有NSString的Foundation方法。他们的Swift书在很多方面都是沉默的。嗯,自从Yosemite失误以来,我就不再信任苹果公司了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接