Как заменить части строки и многое другое. Swift 4 - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть строка:

"Location: &lt;&lt;LesionLoc&gt;&gt;<br>
Quality: &lt;&lt;TESTTEST&gt;&gt;<br>"

Конечный результат должен быть:

Location: &lt;span class=\"span_dropdowntext\" keyword=\"LesionLoc\" style=\"color:blue;font-weight:bold;\"contenteditable=\"False\"&gt;LesionLoc&lt;/span&gt;
Quality: &lt;span class=\"span_dropdowntext\" keyword=\"TESTTEST\" style=\"color:blue;font-weight:bold;\"contenteditable=\"False\"&gt; TESTTEST&lt;/span&gt;

Как видите, все, что мне нужно сделать, это:

  1. Заменить &lt;&lt; на &lt;span class=\"span_dropdowntext\" keyword=\"LesionLoc\" style=\"color:blue;font-weight:bold;\"contenteditable=\"False\"&gt;

  2. Заменить &gt;&gt; на &lt;/span&gt;

  3. И, наконец, (которыйэто то, что мне трудно), вставив строки "LesionLoc" и "TESTTEST" в keyword=/"/" часть.

Заменить просто, просто используйте string.replacingOcurences, но затемЯ подумал, что было бы лучше, если бы я мог перебрать все &lt;&lt; и &gt;&gt;, заменить его внутри цикла и также вставить строки в часть ключевого слова.

Я действительно потерян в этом,Кто-то упоминал об использовании функций индекса и подстроки для возврата новой строки, но я не уверен, как к этому подойти.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018
 private func replaceString(_ str : String)->String{
    guard let keyword = findKeyword(str) else{
        fatalError()
    }
    let replacementString = "&lt;span class=\"span_dropdowntext\" keyword=\"\(keyword)\" style=\"color:blue;font-weight:bold;\"contenteditable=\"False\"&gt;"

    var newString = str.replacingOccurrences(of: "&gt;&gt", with: "&lt;/span&gt")
    newString = newString.replacingOccurrences(of: "&lt;&lt;", with: replacementString)
    return newString
}

private func findKeyword(_ s : String)->String?{
    var str = Array(s)
    let firstKey = "&lt;&lt;"
    let secondKey = "&gt;&gt"

    var startingIndex : Int = 0
    var movingIndex : Int = 0

    while  movingIndex < str.count + 1 - secondKey.count && startingIndex < str.count + 1 - firstKey.count{
        if String(str[startingIndex..<startingIndex + firstKey.count]) != firstKey{
            startingIndex += 1
        }else{
            if movingIndex < startingIndex + firstKey.count{
                movingIndex = startingIndex + firstKey.count
            }else{
                if String(str[movingIndex..<movingIndex + secondKey.count]) != secondKey{
                    movingIndex += 1
                }else{
                    return String(str[startingIndex+firstKey.count..<movingIndex])
                }
            }
        }
    }

    return nil
}

Теперь вы можете использовать функцию replaceString для выполнения работы

let string = "Location: &lt;&lt;LesionLoc&gt;&gt;<br>"
print(replaceString(string))

Ваш конечный результат будет

Location: &lt;span class="span_dropdowntext" keyword="LesionLoc" style="color:blue;font-weight:bold;"contenteditable="False"&gt;LesionLoc&lt;/span&gt;<br>

В конце строки результата есть "br". Я не знаю, хотите ли вы удалить это или нет .. Но если вы это сделаете, вы должны знать, как это сделать.

0 голосов
/ 20 ноября 2018

Во-первых, вы должны найти ключевое слово (в данном случае это LesionLoc и TESTTEST). Вы можете найти его, используя NSRegularExpression с регулярным выражением &lt;&lt;[a-z0-9]+&gt;&gt;

Далее замените ваш &lt;&lt; на

&lt;span class=\"span_dropdowntext\" keyword=\"<KEYWORD>\"style=\"color:blue;font-weight:bold;\"contenteditable=\"False\"&gt;

и &gt;&gt; с &lt;/span&gt;.

Вы можете использовать этот очень простой код

var string = "Location: &lt;&lt;LesionLoc&gt;&gt;<br>\nQuality: &lt;&lt;TESTTEST&gt;&gt;<br>"

do {
    let regex = try NSRegularExpression(pattern: "&lt;&lt;[a-z0-9]+&gt;&gt;", options: NSRegularExpression.Options.caseInsensitive)
    for text in regex.matches(in: string, options: [], range: NSRange(location: 0, length: string.count)).reversed() {
        let keyword = (string as NSString).substring(with: text.range).replacingOccurrences(of: "&lt;&lt;", with: "").replacingOccurrences(of: "&gt;&gt;", with: "")
        let newString = "&lt;span class=\"span_dropdowntext\" keyword=\"\(keyword)\" style=\"color:blue;font-weight:bold;\"contenteditable=\"False\"&gt;\(keyword)&lt;/span&gt;"
        string = (string as NSString).replacingCharacters(in: text.range, with: newString)
    }
    print(string)
} catch {
    print(error.localizedDescription)
}
...