首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regex查找和替换字符串

使用regex查找和替换字符串
EN

Stack Overflow用户
提问于 2017-06-08 08:49:21
回答 1查看 634关注 0票数 2

我需要从带有POST请求的网站返回的字符串中提取数据;我正在用SwiftSoup库解析数据。我使用CSS选择器选择了列表项:

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

返回如下所示的html:

代码语言:javascript
复制
<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>

现在,我需要提取标签和值,并将其存储在数组中或可能独立的变量中。我尝试过如下所示的Regex (没有工作,可能是错误的regex):

代码语言:javascript
复制
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选择器,如:

代码语言:javascript
复制
var labelFirst = try doc.select("ul.icons-list li:nth-child(1)")

但是它也返回HTML结果。所以,我需要在这两种情况下使用regex。这是如何做到的呢?

另一个问题:当我使用SwiftSoup ".select“选择器选择图标列表类时,。如果有例外,我该如何处理呢?目前,我有这个代码,但它不起作用。如果我想处理这个块中的多个尝试块,该怎么办?

代码语言:javascript
复制
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")
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-10 11:12:24

我自己弄明白了。我就是这样做的:

代码语言:javascript
复制
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) 

如果有人给我更好的方法或者改进我的功能,我还是会感激的!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44430935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档