无法使用正则表达式获取全名



我有下面的字符串...

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

最新更新