Regex 将JavaScript正则表达式转换为Swift正则表达式

Regex 将JavaScript正则表达式转换为Swift正则表达式,regex,swift,Regex,Swift,我正在学习Swift,我正在尝试将一小段JavaScript代码转换为Swift。JavaScript代码使用正则表达式拆分字符串,如下所示: var text = "blah.clah##something_else"; var parts = text.match(/(^.*?)\#\#(.+$)/); 执行后,部分数组将包含以下内容: ["blah.clah##something_else", "blah.clah", "something_else"] matchesForRegex

我正在学习Swift,我正在尝试将一小段JavaScript代码转换为Swift。JavaScript代码使用正则表达式拆分字符串,如下所示:

var text = "blah.clah##something_else";
var parts = text.match(/(^.*?)\#\#(.+$)/);
执行后,
部分
数组将包含以下内容:

["blah.clah##something_else", "blah.clah", "something_else"]
matchesForRegexInText("(^.*?)\\#\\#(.+$)", text: "blah.clah##something_else")
["blah.clah##something_else"]
我想在Swift中复制同样的行为。下面是我编写的使用正则表达式将字符串拆分为字符串数组的Swift代码:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {
do {
    let regex = try NSRegularExpression(pattern: regex, options: NSRegularExpressionOptions.CaseInsensitive)
    let nsString = text as NSString
    let results = regex.matchesInString(text,
        options: NSMatchingOptions.ReportCompletion , range: NSMakeRange(0, nsString.length))
        as [NSTextCheckingResult]
    return results.map({
        nsString.substringWithRange($0.range)
    })
} catch {
    print("exception")
    return [""]
}
}

当我使用以下命令调用上述函数时:

["blah.clah##something_else", "blah.clah", "something_else"]
matchesForRegexInText("(^.*?)\\#\\#(.+$)", text: "blah.clah##something_else")
["blah.clah##something_else"]
我得到以下信息:

["blah.clah##something_else", "blah.clah", "something_else"]
matchesForRegexInText("(^.*?)\\#\\#(.+$)", text: "blah.clah##something_else")
["blah.clah##something_else"]
我尝试了许多不同的正则表达式,但都没有成功。正则表达式(^.*?)\\\\\\\\\\\\(.+$)是否正确,或者matchesForRegexInText()函数是否存在问题?我很欣赏你的见解


我使用的是Swift 2和Xcode 7.0 beta版(7A120f)

正如我在评论中提到的,您的模式与整个 字符串,因此
regex.matcheInstalling()
返回一个
NSTextCheckingResult
范围
描述整个字符串。 您要查找的是与捕获组匹配的子字符串 按照你的模式。这些参数可用作
范围索引(i)
,且
i>=1

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        guard let result = regex.firstMatchInString(text, options: [], range: NSMakeRange(0, nsString.length)) else {
            return [] // pattern does not match the string
        }
        return (1 ..< result.numberOfRanges).map {
            nsString.substringWithRange(result.rangeAtIndex($0))
        }
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

正如在注释中已经提到的,您的模式与整个 字符串,因此
regex.matcheInstalling()
返回一个
NSTextCheckingResult
范围
描述整个字符串。 您要查找的是与捕获组匹配的子字符串 按照你的模式。这些参数可用作
范围索引(i)
,且
i>=1

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        guard let result = regex.firstMatchInString(text, options: [], range: NSMakeRange(0, nsString.length)) else {
            return [] // pattern does not match the string
        }
        return (1 ..< result.numberOfRanges).map {
            nsString.substringWithRange(result.rangeAtIndex($0))
        }
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

如果尝试将results=regex.matcheInstalling(文本,选项:NSMatchingOptions.ReportCompletion,范围:NSMakeRange(0,nsString.length))作为数组,会怎么样?我认为主要的问题是,只将第0组传递给使用
nsString.substringWithRange($0.range)
创建的数组(即仅
$0
第1组,整个匹配)。而且您不需要逃避
#
s。谢谢您的建议。我做了更改,但它没有更改输出(仍然是[“blah.clah###something#u else”])。我还在
返回之前添加了一个
print(results.count)
,以打印出数组中的元素数,它是1。如果尝试将
let results=regex.matchesisnstring(text,options:NSMatchingOptions.ReportCompletion,range:NSMakeRange(0,nsString.length))作为数组
,会怎么样?我认为主要的问题是,只将第0组传递给使用
nsString.substringWithRange($0.range)
创建的数组(即仅
$0
第1组,整个匹配)。而且您不需要逃避
#
s。谢谢您的建议。我做了更改,但它没有更改输出(仍然是[“blah.clah###something#u else”])。我还添加了一个
print(results.count)
,在
return
之前打印出数组中的元素数,结果是1。很好。谢谢你的解释和更新的代码。太好了。感谢您的解释和更新的代码。