【问题标题】:Swift Replace Multiple Characters in StringSwift 替换字符串中的多个字符
【发布时间】:2015-03-19 12:27:57
【问题描述】:

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

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

【问题讨论】:

  • 展示你如何“再次调用这行代码”。毕竟,这就是你出错的地方。
  • textView.text = content.stringByReplacingOccurrencesOfString("

    ", withString:"\r") textView.text = content.stringByReplacingOccurrencesOfString("  ", withString:" ")
  • 但是问题来了。您将从最初的content 重新开始。文本视图的文本被覆盖,因为 正在覆盖它!
  • @matt 我理解这个问题是在询问是否有办法一次性替换你想要的所有字符。即 textView.text = content.stringByReplacingOccurrencesOfString([",", ":", "\n", "\r"], withString "")

标签: ios string swift replace


【解决方案1】:

正如@matt 提到的,您将使用相同的content 字符串重新开始。 stringByReplacingOccurrencesOfString 方法实际上并没有改变原始content 字符串中的任何内容。它会返回一个带有替换更改的新字符串,而 content 保持不变。

这样的东西应该适合你

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      我根据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)
      

      打印结果:

      新字符串:Hllo, stckovrflow

      另一个字符串:stack

      【讨论】:

      • 这不是一个有效的解决方案,请使用 CompareOptions.CompareOptions.regularExpression 查看我的答案
      • @Michael 但我想这适用于更一般的情况。如果我的字符串不是正则表达式怎么办?你的答案会有什么变化?
      • @KarthikKannan 你指的是我下面的回答吗?您是否评论错误的答案?如果是这样,请在我的回答中重复该问题,以免其他人感到困惑。
      【解决方案4】:

      replacingOccurrencesString.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 中使用不多的东西。感谢迈克尔的精彩回答。
      • 你能解释一下 - 我应该总是使用.regularExpression吗?如果我只需要指定需要替换/删除的具体符号列表怎么办?
      • 可能还有其他方式,但是正则表达式是表示一组具体字符的好方法。例如,如果我想替换“A”、“B”和“Z”,代码如下所示:x.replacingOccurrences(of: "[ABZ]", with: "7", options: .regularExpression, range :无)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      相关资源
      最近更新 更多