ios - 匹配正则表达式时获取单个元素

标签 ios swift regex

我给了一个特定的字符串..

let string = "[@he man:user:123] [@super man:user:456] [@bat man:user:789]"

现在,我需要一个仅包含名称和 ID 的数组。为此,我应用了以下正则表达式..

extension String {
  func findMentionText2() -> [[String]] {
    let regex = try? NSRegularExpression(pattern: "(@\\w+(?: \\w+)*):user:(\\w+)", options: [])
    if let matches = regex?.matches(in: self, options:[], range:NSMakeRange(0, self.count)) {
      return matches.map { match in
            return (1..<match.numberOfRanges).map {
                let rangeBounds = match.range(at: $0)
                guard let range = Range(rangeBounds, in: self) else {
                    return ""
                }
                return String(self[range])
            }
      }
   } else {
       return []
   }
 }
}

现在,当我执行 let hashString = string.findMentionText() 并打印 hashString 时,我得到一个这样的数组..

[["@he man", "123"], ["@super man", "456"], ["@bat man", "789"]]

到目前为止一切顺利..:)

现在我做了一个 typealias 并想将它添加到一个数组中.. 所以我这样做了...

 typealias UserTag = (name: String, id: String)

  var userTagList = [UserTag]()

然后,

let hashString2 = string.findMentionText2()

for unit in hashString2 {
  let user: UserTag = (name: unit.first!, id: unit.last!)
  userTagList.append(user)

}

for value in userTagList {
    print(value.id)
    print(value.name)
  }

现在在这里,而不是在 中给出 unit.firstunit.last 让 user: UserTag = (name: unit.first!, id: unit .last!),想要将 nameid 添加到类型别名中,当它们与正则表达式匹配时......即当我得到name 或 id,它应该被添加到数组而不是给 unit.firstunit.last..

我怎样才能做到这一点......?

最佳答案

您只需要重构您的 map 以生成一个 UserTag 数组而不是一个字符串数组。这是一种方法:

typealias UserTag = (name: String, id: String)

extension String {
    func findMentionText2() -> [UserTag] {
        let regex = try? NSRegularExpression(pattern: "(@\\w+(?: \\w+)*):user:(\\w+)", options: [])
        if let matches = regex?.matches(in: self, options:[], range:NSMakeRange(0, self.count)) {
            return matches.compactMap { match in
                if match.numberOfRanges == 3 {
                    let name = String(self[Range(match.range(at: 1), in:self)!])
                    let id = String(self[Range(match.range(at: 2), in:self)!])
                    return UserTag(name: name, id: id)
                } else {
                    return nil
                }
            }
        } else {
            return []
        }
    }
}

let string = "[@he man:user:123] [@super man:user:456] [@bat man:user:789]"
print(string.findMentionText2())

但我建议您创建一个 struct 而不是使用元组。它并没有真正改变 findMentionText2 的实现,但使用结构可以让您根据需要添加其他属性和方法。

关于ios - 匹配正则表达式时获取单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437673/

相关文章:

ios - 在 VIewController 之间共享数据 - iOS

mysql - 是否可以循环遍历 MySQL SELECT 中的逗号分隔列表?

python - 如何使用正则表达式匹配文本行中任意位置的价格编号?

iOS MobileSubstrate CFNotificationCenterPostNotification - 不工作

ios - 用户当前国家 - 基于用户当前位置

ios - 主从应用程序背景

swift - 如何在数据更新期间保持 UITableView 的第一行聚焦?

ios - 无法读取 JSON 文件 : "JSON text did not start with array or object"

ios - CoreML - 如何将 InceptionV3 的图像预处理为 MultiArray <Double, 3>?

javascript - 如何在 Javascript 中使用通配符替换