Swift中如何替换字符串中的多个字符

18

以下是我用来将HTML换行符替换为回车的代码。然而,我还有其他需要替换的HTML符号,当我再次调用这行代码时,使用不同的参数,好像第一个被覆盖了一样。有没有办法可以包含多个参数?在Swift中有没有更有效的方法?例如:同时替换br>和nbsp为""。

textView.text = content.stringByReplacingOccurrencesOfString("<br /><br />", withString:"\r")

展示如何“再次调用这行代码”。毕竟,这就是你出错的地方。 - matt
textView.text = content.stringByReplacingOccurrencesOfString("<br /><br />", withString:"\r") textView.text = content.stringByReplacingOccurrencesOfString("  ", withString:" ") - Jeff Richard
但问题在于,您正在从原始“内容”重新开始。文本视图的文本被覆盖,因为是 覆盖了它! - matt
@matt 我理解这个问题是在问是否有一种方法可以一次性替换所有想要的字符。 例如: textView.text = content.stringByReplacingOccurrencesOfString([",", ":", "\n", "\r"], withString "") - Declan McKenna
4个回答

34

使用 replacingOccurrences 方法,并且传入参数 String.CompareOptions.regularExpresion

示例(Swift 3):

var x = "<Hello, [play^ground+]>"
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil)
print(y)

在方括号内输入要替换的字符,例如 [\\ Characters]

输出:

7Hello, 7play7ground777

这太棒了,正是我在寻找的!很好地使用了RegEx,这是我在Swift中没有经常使用的东西。感谢你的精彩回答,Michael。 - Trev14
你能解释一下吗 - 我是否应该总是使用.regularExpression?如果我只需要指定一个需要替换/删除的具体符号列表呢? - Vyachaslav Gerchicov
可能还有其他方法,但正则表达式是表示一组具体字符的好方法。例如,如果我想替换“A”、“B”和“Z”,代码将如下所示:x.replacingOccurrences(of:“[ABZ]”,with:“7”,options:.regularExpression,range:nil) - Michael Peterson

13

我根据Rosetta Code的思路解决了它。

extension String {
    func stringByRemovingAll(characters: [Character]) -> String {
        return String(self.characters.filter({ !characters.contains($0) }))
    }

    func stringByRemovingAll(subStrings: [String]) -> String {
        var resultString = self
        subStrings.map { resultString = resultString.stringByReplacingOccurrencesOfString($0, withString: "") }
        return resultString
    }
}

例子:

let str = "Hello, stackoverflow"
let chars: [Character] = ["a", "e", "i"]
let myStrings = ["Hello", ", ", "overflow"]

let newString = str.stringByRemovingAll(chars)
let anotherString = str.stringByRemovingAll(myStrings)

打印结果:

newString: Hllo, stckovrflow

anotherString: stack


2
这不是一个高效的解决方案,请查看我的答案,使用CompareOptions.CompareOptions.regularExpression。 - Michael Peterson
@Michael 但我猜这在更通用的情况下也适用。如果我的字符串不是正则表达式,你的答案会怎样改变? - Karthik Kannan
@KarthikKannan,您是在指我的下面的回答吗?您是否在错误的答案中进行了评论?如果是这样,请在我的答案中重复问题,以避免其他人的困惑。 - Michael Peterson

8

正如@matt所提到的,您正在使用相同的content字符串重新开始。stringByReplacingOccurrencesOfString方法实际上并不会更改原始的content字符串。它会返回一个新的字符串,其中包含替换更改,而content保持不变。

像这样的一些内容应该适合您:

let result1 = content.stringByReplacingOccurrencesOfString("<br /><br />", withString:"\r") 
let result2 = result1.stringByReplacingOccurrencesOfString(" &nbsp;", withString:" ")
textView.text = result2

1
extension String {
    var html2AttributedString:NSAttributedString {
        return NSAttributedString(data: dataUsingEncoding(NSUTF8StringEncoding)!, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding], documentAttributes: nil, error: nil)!
    }
}

let myHtmlCode = "<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F}</style><span id=\"red\" >Red</span> <span id=\"green\" >Green</span><span id=\"blue\">Blue</span>"

myHtmlCode.html2AttributedString

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