extension String {
/// 正規表現でキャプチャした文字列を抽出する
///
/// - Parameters:
/// - pattern: 正規表現
/// - group: 抽出するグループ番号(>=1)
/// - Returns: 抽出した文字列
func capture(pattern: String, group: Int) -> String? {
let result = capture(pattern: pattern, group: [group])
return result.isEmpty ? nil : result[0]
}
/// 正規表現でキャプチャした文字列を抽出する
///
/// - Parameters:
/// - pattern: 正規表現
/// - group: 抽出するグループ番号(>=1)の配列
/// - Returns: 抽出した文字列の配列
func capture(pattern: String, group: [Int]) -> [String] {
guard let regex = try? NSRegularExpression(pattern: pattern) else {
return []
}
guard let matched = regex.firstMatch(in: self, range: NSRange(location: 0, length: self.count)) else {
return []
}
return group.map { group -> String in
return (self as NSString).substring(with: matched.range(at: group))
}
}
}
<使用例>
let pattern = "^(https?)://([^/]+)/?"
let str = "https://www.google.co.jp/"
print(str.capture(pattern: pattern, group: 2))
// Optional("www.google.co.jp")
print(str.capture(pattern: pattern, group: [1, 2]))
// ["https", "www.google.co.jp"]