【问题标题】:Swift 4 Replace word within StringSwift 4 替换字符串中的单词
【发布时间】:2018-03-26 15:08:42
【问题描述】:

设置:一个 UITextField 和一个带有建议用户的 Tableview 我尝试得到以下结果:

我希望用户能够链接其他用户。 只要我用数组中的最后一个单词搜索它就可以正常工作

 let caption = captionTextView.text
    let words = caption?.components(separatedBy: .whitespacesAndNewlines)

     guard let searchingWord = words?.last else {return}

    if searchingWord.hasPrefix("@") {
        self.indicator.startAnimating()
        let search = searchingWord.trimmingCharacters(in: CharacterSet.punctuationCharacters).lowercased()
 }

但如果用户想在数组中间或至少不在数组末尾调整用户名,搜索功能将无法正常工作,因为它仍然使用数组中的最后一个单词进行搜索

例子:

"Hey how are you @Lisa @Marcel @Thomas"

如果用户想要将“@Lisa”更改为“@Lisbeth”,搜索功能将搜索 Thomas 作为数组中的最后一个单词

我无法获取我正在处理的单词,只有数组中的最后一个和第一个单词,但是我能够获取当前光标位置

let cursor =  captionTextView.cursorOffset!

这是一个扩展。

那么我如何得到我正在处理的单词,直到左边的下一个“@”和右边的下一个空格?提前致谢!

【问题讨论】:

    标签: arrays swift string


    【解决方案1】:

    不妨试试这样的:

    if let selectedRange = textview.selectedTextRange {
        let cursorOffset = textview.offset(from: textview.beginningOfDocument, to: selectedRange.start)
        let text = textview.text
        let substring = text?.prefix(cursorOffset)
        let editedWord = substring?.split(separator: "@")
    }
    

    (写在手机上,未经测试)

    【讨论】:

      【解决方案2】:

      一个解决方案是正则表达式

      let string = "Hey how are you @Lisa @Marcel @Thomas"
      let searchingWord = "Lisa"
      let replacingWord = "Lisbeth"
      
      let pattern = "@\(searchingWord)\\s"
      string.replacingOccurrences(of: pattern, with: "@\(replacingWord) ", options: .regularExpression)
      

      该模式搜索@,后跟搜索词,后跟一个空格字符。

      【讨论】:

        【解决方案3】:

        既然你说事情正在按照你想要的方式工作,如果最后一个单词是其中包含用户名的单词,你只需要遍历所有单词。根据您的需要,您可能需要跟踪文本中之前的用户名,以免您多次搜索同一个用户,但一组使用过的用户名应该为您排序。

        此外,除非您想防止用户名称中包含下划线等,否则您还应该调整删除 @ 符号的方式。

        guard let words = captionTextView.text?.components(separatedBy: .whitespacesAndNewlines) else { return }
        for word in words where word.hasPrefix("@") {
            self.indicator.startAnimating()
            let search = word.replacingOccurrences(of: "@", with: "").lowercased()
        }
        

        将上述代码粘贴到使用您提供的示例字符串代替 captionTextView.text? 并打印 search 的 Playground 中,每次产生...

        lisa
        marcel
        thomas
        

        【讨论】:

          猜你喜欢
          • 2015-07-03
          • 1970-01-01
          • 2014-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多