Ios 在匹配正则表达式时获取单个元素
我有这样一个字符串Ios 在匹配正则表达式时获取单个元素,ios,swift,regex,Ios,Swift,Regex,我有这样一个字符串 [["@he man", "123"], ["@super man", "456"], ["@bat man", "789"]] let string=“[@he-man:user:123][@super-man:user:456][@bat-man:user:789]” 现在,我需要一个只包含名称和id的数组 extension String { func findMentionText2() -> [[String]] { let regex = tr
[["@he man", "123"], ["@super man", "456"], ["@bat man", "789"]]
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 []
}
}
}
到目前为止还不错……)
现在我制作了一个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!)
,要将名称
和id
添加到typealias中,当它们从正则表达式中匹配时..即当我得到名称或id时,应将其添加到数组中,而不是给出单位。first
或单位。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())
但是我建议您创建一个
结构
,而不是使用元组。它实际上并没有改变findMentionText2
的实现,但使用结构可以根据需要添加其他属性和方法。您是否在询问如何将findMentionText2
方法的返回类型改为[UserTag]
,而不是[[String]]
?是@rmaddy.。你说得对……当你打印UserTag数组时,默认情况下你会得到这个输出。这是您想要的元组数组。可以使用数组中的数据执行任何操作。你可以使用map
和filter
以及你想要的任何东西。非常感谢你的回答@rmaddy..但是你介意用几行解释一下你到底做了什么..我的意思是..像..为什么match.numberOfRanges==3这样..你的正则表达式有两个捕获组。第一个是名字,第二个是id,对吗?你写的,所以你应该已经知道那部分了。那么一场比赛将有两个捕获组加上一个用于整个比赛。这就是为什么我增加了3个匹配项的检查。它只是为了避免在尝试访问两个所需范围时发生崩溃。Ok@rmaddy..再次感谢…:)