Ios 如何在Swift中检查正则表达式是否有效?

Ios 如何在Swift中检查正则表达式是否有效?,ios,regex,swift,uitextfield,Ios,Regex,Swift,Uitextfield,我正在使用正则表达式在文本视图中搜索。对于简单字符串,所有操作都可以,但当我尝试只输入正则表达式运算符的一部分时,我会得到一个带有错误的现金: Error Domain=NSCocoaErrorDomain Code=2048 "The value “\” is invalid." UserInfo={NSInvalidValue=\} 例如,如果我输入“\n”,它会工作,但如果我只输入“\”(不带引号),我会得到崩溃。我不能做的是找到一种方法在使用之前检查表达式 我使用的代码部分基于和 扩展

我正在使用正则表达式在文本视图中搜索。对于简单字符串,所有操作都可以,但当我尝试只输入正则表达式运算符的一部分时,我会得到一个带有错误的现金:

Error Domain=NSCocoaErrorDomain Code=2048 "The value “\” is invalid." UserInfo={NSInvalidValue=\}
例如,如果我输入“\n”,它会工作,但如果我只输入“\”(不带引号),我会得到崩溃。我不能做的是找到一种方法在使用之前检查表达式

我使用的代码部分基于和

扩展名NSRegularExpression{ 便利初始化?(选项:搜索选项){ 让searchString=options.searchString 将isCaseSensitive=options.matchCase//设置为true 将isWholeWords=options.wholeWords//设置为false 让escapeMetacharacters=options.escapeMetacharacters//设置为false //处理区分大小写的选项 var regexOption:NSRegularExpressionOptions=.case不区分大小写 if isCaseSensitive{//if它是匹配大小写删除大小写敏感选项 regexOption=[] } //将搜索字符串放入模式中 var pattern=searchString 如果是wholewords{
pattern=“(?下面的第一个代码显示了不稳定的行为,您不应该使用它。 (请参阅本答案的后半部分。)

将一行添加到可失败的初始值设定项:

        do {
            try self.init(pattern: pattern, options: regexOption)
        } catch {
            print(error)
            return nil //->you need to return nil to tell initialization failed
        }
(我认为Swift编译器应该警告这个缺失的
返回nil
。可能是Swift的一个bug?)

之后,您可以安全地检查结果是否为零:

let sOpts = SearchOptions(searchString: "\\", replacementString: "", matchCase: false, wholeWords: false)
if let regex = NSRegularExpression(options: sOpts) {
    //Use regex
    print(regex)
} else {
    //Process errors
    print("Something bad in SearchOptions")
}
(我省略了escapeMetacharacters,因为它还没有被使用。)


据我测试,使用静态方法从未崩溃

extension NSRegularExpression {
    static func expresssionWith(options: SearchOptions) -> NSRegularExpression? {
        let searchString = options.searchString
        let isCaseSensitive = options.matchCase // set to true
        let isWholeWords = options.wholeWords // set to false

        // handle case sensitive option
        var regexOption: NSRegularExpressionOptions = .CaseInsensitive
        if isCaseSensitive { // if it is match case remove case sensitive option
            regexOption = []
        }

        // put the search string in the pattern
        var pattern = searchString

        if isWholeWords {
            pattern = "(?<!\\w)" + NSRegularExpression.escapedPatternForString(searchString) + "(?!\\w)"
        }

        do {
            return try NSRegularExpression(pattern: pattern, options: regexOption)
        } catch  {
            print(error)
            return nil
        }
    }
}

let sOpts = SearchOptions(searchString: "\\", replacementString: "", matchCase: false, wholeWords: false)

if let regex = NSRegularExpression.expresssionWith(sOpts) {
    //Use regex
    print(regex)
} else {
    //Process errors
    print("Something bad in SearchOptions")
}
扩展名NSRegularExpression{ 静态函数表达式(选项:SearchOptions)->NSRegularExpression{ 让searchString=options.searchString 将isCaseSensitive=options.matchCase//设置为true 将isWholeWords=options.wholeWords//设置为false //处理区分大小写的选项 var regexOption:NSRegularExpressionOptions=.case不区分大小写 if isCaseSensitive{//if它是匹配大小写删除大小写敏感选项 regexOption=[] } //将搜索字符串放入模式中 var pattern=searchString 如果是wholewords{
pattern=“(?嗨,OOPer,谢谢你的回答。我确信它适用于大多数实现,不幸的是,在我的情况下,它不起作用,可能是我做错了什么。此外,在返回nile和执行安全检查后,无论如何我都会遇到一个崩溃,错误为'error Domain=NSCocoaErrorDomain Code=2048“the value”\”无效。“UserInfo={NSInvalidValue=\}”。我正在尝试不同的实现,但由于我的经验不足,我认为这将是一个非常漫长的过程…很抱歉结果不好。当您找到其他信息告诉我们时,请编辑您的问题并添加它。我或许多其他读者将帮助您。非常感谢。我注意到,如果我删除“print(error)”行,我得到一个不同的错误:“malloc:**对象0x7c874b80的错误:未分配要释放的指针***在malloc_error_break中设置一个断点以进行调试”。我将尝试一步一步地调试。我发现了相同的错误“malloc:**",同时尝试对我的代码进行一些修改,这似乎比我预期的更不稳定。我将尝试找到一些足够稳定的方法来实际使用。我收到另一条消息
NSRegularExpression对象0x100602650在已解除分配时被过度释放;在解除分配错误期间中断objc\u overrelease\u以调试
。我担心这会导致一个快速错误,例如在便利初始化器中使用throws初始化器。据我测试,我无法成功定义便利初始化器(最终所有尝试都失败了),但工厂方法到目前为止仍按预期工作。我将编辑我的答案并显示我的代码。
extension NSRegularExpression {
    static func expresssionWith(options: SearchOptions) -> NSRegularExpression? {
        let searchString = options.searchString
        let isCaseSensitive = options.matchCase // set to true
        let isWholeWords = options.wholeWords // set to false

        // handle case sensitive option
        var regexOption: NSRegularExpressionOptions = .CaseInsensitive
        if isCaseSensitive { // if it is match case remove case sensitive option
            regexOption = []
        }

        // put the search string in the pattern
        var pattern = searchString

        if isWholeWords {
            pattern = "(?<!\\w)" + NSRegularExpression.escapedPatternForString(searchString) + "(?!\\w)"
        }

        do {
            return try NSRegularExpression(pattern: pattern, options: regexOption)
        } catch  {
            print(error)
            return nil
        }
    }
}

let sOpts = SearchOptions(searchString: "\\", replacementString: "", matchCase: false, wholeWords: false)

if let regex = NSRegularExpression.expresssionWith(sOpts) {
    //Use regex
    print(regex)
} else {
    //Process errors
    print("Something bad in SearchOptions")
}