Найти и заменить строку с помощью регулярных выражений

Мне нужно извлечь данные из строки, которая возвращается с веб-сайта с запросом POST; Я анализирую данные с помощью библиотеки SwiftSoup. Я выбрал элементы списка с помощью селектора CSS:

let iconsList: Element = try doc.select("ul.icons-list").first()!

который возвращает HTML, как это:

<ul class="icons-list"> 
   <li><strong>Label 1:</strong> Value 1 (Some text) </li> 
   <li><strong>Label 2:</strong> Value 2</li> 
   <li><strong>Label 3:</strong> Value 3</li> 
   <li><strong>Label 4:</strong> Value 4 </li> 
   <li><strong>Label 5:</strong> Value 5</li> 
</ul>

Теперь мне нужно извлечь метки и значения и сохранить их внутри массива или отдельных переменных. Я пробовал регулярное выражение, как показано ниже (не сработало, может быть, неправильное регулярное выражение):

let result = "This <strong>Needs to be removed</strong> is my string"
let regex = try! NSRegularExpression(pattern: "<strong>(.*)</strong>", options: .caseInsensitive)
var newStr = regex.stringByReplacingMatches(in: result, options: [], range: NSRange(0..<str.utf16.count), withTemplate: "")
print(newStr)

А также попробовал SwiftSoup селектор, как:

var labelFirst = try doc.select("ul.icons-list li:nth-child(1)")

Но это также возвращает результат HTML. Итак, мне нужно использовать регулярные выражения в обоих случаях. Как это может быть сделано?

Другой вопрос: когда я выбираю класс со списком иконок, используя SwiftSoup, селектор ".select". Если есть исключение, то как мне справиться с этим? В настоящее время у меня есть этот код, но он не работает. А что если я захочу обработать несколько блоков try внутри этого блока?

do{
      let doc: Document = try SwiftSoup.parse(responseString!)
      let iconsList: Element = try doc.select("ul.icons-list").first()!
      print(iconsList)
  }catch Exception.Error( _, let message){
      print("icons list not found "+message)
  }catch{
      print("error")
  }

1 ответ

Решение

Я смог понять сам. Вот как я это сделал:

var res = "<ul class=\"icons-list\"><li><strong>Label 1:</strong> Value 1 (Some text) </li></ul>"

extension String {
  func capturedGroups(withRegex pattern: String) -> [String] {
    var results = [String]()

    var regex: NSRegularExpression
    do {
        regex = try NSRegularExpression(pattern: pattern, options: [])
    } catch {
        return results
    }

    let matches = regex.matches(in: self, options: [], range: NSRange(location:0, length: self.characters.count))

    guard let match = matches.first else { return results }

    let lastRangeIndex = match.numberOfRanges - 1
    guard lastRangeIndex >= 1 else { return results }

    for i in 1...lastRangeIndex {
        let capturedGroupIndex = match.rangeAt(i)
        let matchedString = (self as NSString).substring(with: capturedGroupIndex)
        results.append(matchedString)
    }

    return results
  }
}

let label1 = res.capturedGroups(withRegex: "<strong>(.*)</strong>")
let value1 = res.capturedGroups(withRegex: "</strong>(.*)</li>")

print("\(label1[0]): \(value1[0])")
//Output: Label 1:  Value 1 (Some text) 

Я все равно буду признателен, если кто-нибудь даст мне лучший способ ИЛИ улучшить мою функцию!

Другие вопросы по тегам