Swift 4替换String中的单词

时间:2018-03-26 15:08:42

标签: arrays swift string

设置:UITextField和包含建议用户的Tableview 我尝试得到以下结果:

我希望用户能够链接其他用户。 只要我用数组中的最后一个单词搜索

,它的工作正常
from bs4 import BeautifulSoup

XML = '''
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
 xmlns:cd="http:xyz.com#">

<rdf:Description rdf:about="http:xyz.com#">
    <cd:algorithmid>DPOT-5ab247867d368</cd:algorithmid>
    <cd:owner>arun</cd:owner>
    <cd:acesskey>ACCESS-5ab247867d370</cd:acesskey>
    <cd:purpose>Research</cd:purpose>
    <cd:metadata>10</cd:metadata>
    <cd:completeness>Partial</cd:completeness>
    <cd:completeness>Yes</cd:completeness>
    <cd:inclusion_1>age</cd:inclusion_1>
    <cd:feature_1>Sex</cd:feature_1>
    <cd:target>Diagnosis</cd:target>
</rdf:Description>

</rdf:RDF>'''

soup = BeautifulSoup(XML, 'xml')

target = soup.find('target').text
print(target)
# Diagnosis

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

示例:

 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()
 }

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

我无法得到我正在工作的单词,只有数组中的最后和第一个单词,但是我能够使用

获取当前光标位置
"Hey how are you @Lisa @Marcel @Thomas"

这是一个扩展名。

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

3 个答案:

答案 0 :(得分:0)

也许尝试这样的事情:

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: "@")
}

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

答案 1 :(得分:0)

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

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)

模式搜索@后跟搜索词后跟空格字符。

答案 2 :(得分:0)

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

此外,除非您想要阻止用户使用下划线以及名称中的下划线,否则您应该调整删除@符号的方式。

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 ...

lisa
marcel
thomas