我给了一个特定的字符串..
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.first
和 unit.last
让 user: UserTag = (name: unit.first!, id: unit .last!)name
和 id
添加到类型别名中,当它们与正则表达式匹配时......即当我得到name 或 id,它应该被添加到数组而不是给 unit.first
或 unit.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/