2016-07-14 83 views
0

我使用正則表達式在textView中進行搜索。所有的正常工作與簡單的字符串,但是當我試圖進入只有一個正則表達式運算符的一部分,我收到了現金的錯誤:如果正則表達式有效,如何檢查Swift?

Error Domain=NSCocoaErrorDomain Code=2048 "The value 「\」 is invalid." UserInfo={NSInvalidValue=\} 

例如,如果我輸入「\ n」它的工作原理,但如果我只輸入「\」(不含引號),我得到崩潰。我無法做的是找到一種方法來檢查表達式之前使用它。

我使用這個代碼部分基於this tutorialthis answer by Wiktor Stribiżew:

extension NSRegularExpression { 
    convenience init?(options: SearchOptions) { 
     let searchString = options.searchString 
     let isCaseSensitive = options.matchCase // set to true 
     let isWholeWords = options.wholeWords // set to false 
     let escapeMetacharacters = options.escapeMetacharacters // 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 { 
      try self.init(pattern: pattern, options: regexOption) 
     } catch { 
      print(error) 
     } 
    } 
} 

回答

1

下面的第一個代碼顯示不穩定的行爲,你不應該使用它。 (請參閱本答案的後半部分。)

一行添加到您的failable初始化:

 do { 
      try self.init(pattern: pattern, options: regexOption) 
     } catch { 
      print(error) 
      return nil //->you need to return nil to tell initialization failed 
     } 

(我認爲斯威夫特編譯器應該警告失蹤return nil可能是雨燕的一個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") 
} 
+0

嗨OOPer,謝謝你的回答。我確定它適用於大多數實現,不幸的是,在我的情況下,它失敗了,也許我做錯了什麼。此外,隨着返回尼羅河和安全檢查實施我反正與這個錯誤崩潰'錯誤域= NSCocoaErrorDomain代碼= 2048「值」\「是無效的。」的UserInfo = {NSInvalidValue = \}」。我嘗試了不同的實現,但由於我的經驗不足,我認爲這將是一段非常漫長的旅程...... – Cue

+0

對不起,結果很糟糕。當您找到其他信息告訴我們時,請編輯您的問題並添加它。我或許多其他讀者會幫助你。 – OOPer

+0

非常感謝。我注意到如果我刪除了「打印(錯誤)」行,我得到一個不同的錯誤:對象0x7c874b80的malloc:***錯誤:釋放指針未分配***設置malloc_error_break中的斷點來調試。我會嘗試逐步調試。 – Cue

相關問題