我想从其网址中提取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
答案 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
/ catch
,if 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。