我有下面的字符串...
let string = “[@he man:user:123] [@super man:user:456] [@bat man:user:789]”
我应用一个正则表达式来获取这样的名称......
func findMentionText2() -> [String] {
var arr_hasStrings:[String] = []
let regex = try? NSRegularExpression(pattern: "(@[a-zA-Z0-9_\p{N}]*)", options: [])
if let matches = regex?.matches(in: self, options:[], range:NSMakeRange(0, self.count)) {
for match in matches {
arr_hasStrings.append(NSString(string: self).substring(with: NSRange(location:match.range.location, length: match.range.length )))
}
}
return arr_hasStrings
}
如果我这样做let hashString = string.findMentionText()
,我会得到[“@he”, “@super”, “@bat”]
但我想要的是这样的全名...
[“@he man”, “@super man”, “@bat man”]
我需要为此使用什么正则表达式..?另外,我如何获取与每个用户关联的id..?
编辑 1使用类型别名将每个值添加到数组中
我像这样声明了一个数组和类型别名...
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)
}
//EACH DETAIL PRINTED HERE
for value in userTagList {
print(value.id)
print(value.name)
}
以下方法提取这些子字符串
"(@[^\]\[:]+):user:(\w+)"
它匹配并捕获第 1 组中的@
字符,然后捕获除 ]
、[
和 :
以外的 1+ 个字符,然后匹配:user:
,然后将任何 1+ 单词字符捕获到第 2 组中。请参阅正则表达式演示。
作为替代方案,您可以使用
"(@\w+(?: \w+)*):user:(\w+)"
请参阅此正则表达式演示。我使用w
而不是[a-zA-Z0-9_\p{N}]
,因为w
也匹配任何字母,数字和_
。 该模式将匹配并捕获到组中 1 个@
字符,然后是 1+ 单词字符(字母、数字或 _
(,然后是 0 个或多次重复的空格,然后是 1+ 单词字符,然后它将匹配:user:
,然后将任何 1+ 单词字符捕获到第 2 组中。
如果要匹配任何空格,请将文本空格替换为 \s
。
下面是 Swift 演示:
let string = "[@he man:user:123] [@super man:user:456] [@bat man:user:789]"
extension String {
func findMentionText() -> [[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()
print(hashString)
// => [["@he man", "123"], ["@super man", "456"], ["@bat man", "789"]]
试试这个: (@[\w ]+):user:(\d+)
你在这里有一个演示。
用户名将位于第一个捕获组上。并且 Id 将位于第二个捕获组上。
解释:
( # begin of first capturing group
@ # literal @
[ # begin of character class: It must be:
\w # a-z, 0-9, underscore
_ # and spaces (i'm using an underscore here just for make it clear)
] # end of character class
+ # repeated 1 or more
) # end of first capturing group
:user: # literal :user:
(\d+) # begin of second capturing group, 1 or more digits, end of second capturing group