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

时间:2018-03-19 09:43:05

标签: ios iphone swift

我想从其网址中提取Vimeo ID。我尝试了很多解决方案,但没有找到我想要的快捷方式。我参考了许多问题,并在JAVA中找到了一个解决方案。我想在iOS swift中使用相同的行为,因此我可以从匹配的组数组中提取ID。

Using Regular Expressions to Extract a Value in Java

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

“[HTTP | HTTPS] +:\ / \ /(?: WWW \ |玩家\。)VIMEO \ .COM \ /(?:通道\ /(?:?\ W + \ /)|组? \ /([^ \ /] *)\ /视频\ / |相册\ /(\ d +)\ /视频\ / |视频\ / |)([A-ZA-Z0-9 _ \ - ] +)(&安培;?+)“

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

2 个答案:

答案 0 :(得分:8)

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)")

这应该有效。

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

应该改进什么?
好吧,我做了各种各样的力量打包(每次我写一个!)。为了逻辑而不添加do / catchif let等。我强烈建议您仔细检查它们。

答案 1 :(得分:3)

这是另一个版本。我使用named capturing group,与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之外的所有其他内容都是non-capturing