Ios REGEX将获得Vimeo&;每日运动ID

Ios REGEX将获得Vimeo&;每日运动ID,ios,swift,nsregularexpression,Ios,Swift,Nsregularexpression,我发现了两个有用的javascript正则表达式,但它们似乎都不能在Swift上正常工作 这适用于Youtube URL,但不适用于Vimeo和DailyMotion。Vimeo和Dailymotion正则表达式都在javascript上工作 谢谢各位 **使用解决方案进行编辑** 谢谢大熊和Larme private func getVendorId(_ regexStr:String, _ videoUrl:String, _ search:[Int]) -> String {

我发现了两个有用的javascript正则表达式,但它们似乎都不能在Swift上正常工作

这适用于Youtube URL,但不适用于Vimeo和DailyMotion。Vimeo和Dailymotion正则表达式都在javascript上工作

谢谢各位

**使用解决方案进行编辑**

谢谢大熊和Larme

private func getVendorId(_ regexStr:String, _ videoUrl:String, _ search:[Int]) -> String {

    let regex = try? NSRegularExpression(pattern: regexStr, options: .caseInsensitive)
    let result:[NSTextCheckingResult] = (regex?.matches(in: videoUrl, options: [], range: NSRange(location: 0, length: (videoUrl.characters.count ))))!

    if result.count > 0 {
        let groups = result.first!;
        for i in search {
            if (groups.rangeAt(i).length != 0) {
                return (videoUrl as NSString).substring(with: groups.rangeAt(i))
            }
        }
    }

    return "";
}

override func viewDidLoad() {

    let youtubeUrl   = "https://www.youtube.com/watch?v=MCc0V5bgEF8";
    let youtubeRegex = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)";
    let youtubeId    = getVendorId(youtubeRegex, youtubeUrl, [0]);
    print("YOUTUBE ID -> \(youtubeId)")

    let vimeoUrl    = "https://player.vimeo.com/video/233459603";
    let vimeoRegex  = "https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?)";
    let vimeoId     = getVendorId(vimeoRegex, vimeoUrl, [2]);
    print("VIMEO ID -> \(vimeoId)")

    let dailyMotionUrl   = "http://www.dailymotion.com/hub/x9q_Galatasaray";
    let dailyMotionRegex = "^.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?";
    let dailyMotionId    = getVendorId(dailyMotionRegex, dailyMotionUrl, [4, 2]);
    print("DAILYMOTION ID -> \(dailyMotionId)")


    super.viewDidLoad()

}
private func getVendorId(\regexStr:String,\videoUrl:String,\usearch:[Int])->String{
让regex=try?NSRegularExpression(模式:regexStr,选项:。不区分大小写)
让结果:[NSTextCheckingResult]=(regex?.matches(in:videoUrl,选项:[],范围:NSRange(位置:0,长度:(videoUrl.characters.count)))!
如果result.count>0{
让组=结果。首先!;
因为我在寻找{
if(组范围(i).length!=0){
return(作为NSString的videoUrl).substring(带:groups.rangeAt(i))
}
}
}
返回“”;
}
重写func viewDidLoad(){
让youtubeUrl=”https://www.youtube.com/watch?v=MCc0V5bgEF8";

让youtubergex=”((?您的正则表达式工作正常。问题是您没有考虑多个捕获组。对于每个捕获组,您的变量
result
将包含一个
NSRange
;您需要从其中一个获取捕获的ID,而不是从
result?.range
。下面是一些示例代码,向您展示我的意思。添加它到您的
getId()
函数,在
let result
之后:

print("Capture group count", result!.numberOfRanges)

for i in 0 ..< result!.numberOfRanges {
    if result!.range(at: i).length == 0 {
        print("Group \(i) is empty")
    } else {
        print("Group \(i) captured", (url as NSString).substring(with: result!.range(at: i)))
    }
}
打印(“捕获组计数”,结果!.numberOfRanges)
对于0中的i..

我不清楚为什么你的youtube id会以这种方式抓拍;我认为这与“向后看”有关(我不是向后看的专家)但问题不在于正则表达式;而在于您需要从捕获组获取id,而不是直接从
regles获取id。首先,您的正则表达式工作正常。问题在于您没有考虑多个捕获组。对于每个捕获组,您的变量
result
将包含
NSRange
oup;您需要从其中一个获取捕获的ID,而不是从
result?.range
。下面是一些示例代码,向您展示我的意思。将其添加到
getId()
函数中,在
let result
之后:

print("Capture group count", result!.numberOfRanges)

for i in 0 ..< result!.numberOfRanges {
    if result!.range(at: i).length == 0 {
        print("Group \(i) is empty")
    } else {
        print("Group \(i) captured", (url as NSString).substring(with: result!.range(at: i)))
    }
}
打印(“捕获组计数”,结果!.numberOfRanges)
对于0中的i..

我不清楚为什么你的youtube id会以这种方式抓拍;我认为这与“向后看”有关(我不是向后看的专家)。但问题不在于您的正则表达式;只是您需要从捕获组获取id,而不是直接从
regles获取id。首先

此代码不可编译。我想提供帮助,但您必须粘贴实际代码。我将函数定义中的第二个
regStr
更改为
url
,但随后注意到,无论如何,您没有对该参数执行任何操作。请尝试粘贴实际代码。我编辑了代码,谢谢!
let regRes:[Any]
如果您编写
let regRes:[NSTextCheckingResult]
相反,您可以避免在
regRes.first中使用
作为?NSTextCheckingResult
作为?NSTextCheckingResult
。对于其余部分,您是否检查了所有
regrest
值,而不是只检查了第一个值?它们打印了什么?因为您有不同的regex组,可能会有兴趣找到对每个regex有用的值。谢谢,w工作正常!此代码无法编译。我想提供帮助,但您必须粘贴实际代码。我已将函数定义中的第二个
regStr
更改为
url
,但随后我注意到,您没有对该参数做任何操作。请尝试粘贴实际代码。我编辑了代码,谢谢!
let reges:[Any]
如果您写入
让我们重新记录:[NSTextCheckingResult]
相反,您可以避免在
regRes.first中使用
作为?NSTextCheckingResult
作为?NSTextCheckingResult
。对于其余部分,您是否检查了所有
regrest
值,而不是只检查了第一个值?它们打印了什么?因为您有不同的regex组,可能会有兴趣找到对每个regex有用的值。谢谢,w工作!