Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在匹配正则表达式时获取单个元素_Ios_Swift_Regex - Fatal编程技术网

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..再次感谢…:)