使用正则表达式在 iOS Swift 中提取值



我想从它的URL中提取Vimeo Id。我尝试了许多解决方案,但没有找到我真正想要的 swift。我参考了许多问题,并在JAVA中找到了一个解决方案。我想要在 iOS swift 中相同的行为,以便我可以从匹配的组数组中提取 ID。

在 Java 中使用正则表达式提取值

我使用以下 vimeo URL 正则表达式,如果字符串与正则表达式匹配,我想要组 3:

"[http|https]+:\/\/(?:www\.|玩家\.(?vimeo\.com\/(?:channels\/(?:\w+\/(?|组\/([^\/]*(\/视频\/|专辑\/(\d+(\/视频\/|视频\/|(([a-zA-Z0-9_\-]+((&.+(?">

测试 Vimeo 网址: https://vimeo.com/62092214?query=foo

let strToTest = "https://vimeo.com/62092214?query=foo"
let pattern = "[http|https]+:\/\/(?:www.|player.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)([a-zA-Z0-9_\-]+)(&.+)?"
let regex = try! NSRegularExpression.init(pattern: pattern, options: [])
let match = regex.firstMatch(in: strToTest, options: [], range: NSRange.init(location: 0, length: strToTest.count))
let goup3Range = match?.range(at: 3)
let substring = (strToTest as NSString).substring(with: goup3Range!)
print("substring: (substring)")

这应该行得通。

您需要转义模式中的所有
您需要调用 range(at:) 以根据您的模式(当前为 group3(获取所需组的范围,然后是子字符串。

应该改进什么?
好吧,我做了各种强制解开(每次我写!(。为了逻辑而不加do/catchif let等。我强烈建议您仔细检查它们。

这是另一个版本。我使用的是命名捕获组,与 Larme 提供的答案略有不同。

let regex = "[http|https]+:\/\/(?:www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|video\/|)(?<vimeoId>[a-zA-Z0-9_\-]+)(?:&.+)?"
let vimeoURL = "https://vimeo.com/62092214?query=fooiosiphoneswift"
let regularExpression = try! NSRegularExpression(pattern: regex,
                                                options: [])
let match = regularExpression.firstMatch(in: vimeoURL,
                                         options: [],
                                         range: NSRange(vimeoURL.startIndex ..< vimeoURL.endIndex,
                                                        in: vimeoURL))
if let range =  match?.range(withName: "vimeoId"),
    let stringRange = Range(range, in: vimeoURL) {
    let vimeoId = vimeoURL[stringRange]
}

另外,请检查我是否对您的正则表达式进行了一些修改,以便除了 vimeoId 之外的其他所有内容都是非捕获的。

最新更新