2012-11-29 92 views
7

我在寫一個讓用戶指定正則表達式的應用程序。當然,用戶會犯錯,所以我需要一種方法來處理不可解析的正則表達式,併爲用戶提供一些關於如何解決問題的可行建議。在JavaScript中分解正則表達式解析異常

我遇到的問題是new RegExp("something awful")引發的異常對正則表達式n00bs沒有幫助,並且每個瀏覽器都有不同的消息。例如:

考慮:

try{ 
    new RegExp("(pie"); 
}catch(e){ 
    console.log(e.message); 
} 
  • 火狐拋出 「未結束的括號」。
  • Safari瀏覽器拋出「缺少)」
  • 鉻拋出「未終止組」

如果這些消息字符串用戶的語言本地化它不會讓我感到吃驚,或者說,他們已失去了時間,這是一個瘋狂的結,以exception.message解開。

我的目標是抓住這個例外,弄清楚它的真正含義,並提出一個更加適合初學者的信息。 (並且最終在本例中突出顯示無與倫比的paren。)

是否還有其他一些我應該使用的異常標識符?有沒有更好的方法來區分這些?所有這些都失敗了,是否有人收集了所有這些字符串跨越幾個最流行的瀏覽器?

+1

我會看看什麼一些流行的正則表達式在線測試頁面 – mplungjan

+1

正則表達式'(abcd})'有一個太少的花括號或一個太多? –

+0

這裏有一個技巧來獲得最可能的消息。編寫一個包含一些有效但非常複雜的正則表達式的腳本。真正使用和濫用JavaScript中提供的所有正則表達式功能。並且當然嵌套他們和一切。然後隨機刪除,添加或更改這些字符並嘗試編譯它們。並保存所有的錯誤信息(以及導致它的正則表達式)。由於這種隨機性,你應該能夠嘗試很多失敗的案例,並且由於自動化,你不必擔心重複。 –

回答

3

想法:在運行時全力以赴。例如。

var tellMeWhatIDidWrong = (function() { 

    var tests = { 
     '(': 'You did not close your group... duh!', 
     ')': 'You seem to have an unmatched parenthesis.', 
     '*': 'That token is illegal in that position' 
    }; 

    var errors = {}; 

    for (var i in tests) { 
     try { RegExp(i); } catch(e) { 
      errors[String(e).split(':').pop()] = tests[i]; 
     } 
    } 


    return function(regexStr) { 
     try { RegExp(regexStr); } catch(e) { 
      e = String(e).split(':').pop(); 
      if (e in errors) { 
       return errors[e]; 
      } 
      return 'Unknown error'; 
     } 
     return 'Nothing -- it is fine!'; 
    }; 

}()); 

tellMeWhatIDidWrong('(abc?'); // -> "You did not close your group... duh!" 

當然,只有瀏覽器的內置錯誤報告足夠具體時,這纔會起作用。他們中的許多人吸吮。例如。 Opera對這個問題絕對沒有暗示,所以上述方法將無法正常工作,而且任何其他解決方案都不會依賴Opera的本機錯誤消息。

我建議發送正則表達式關閉一個應用程序運行的Node.js和得到很好的V8錯誤消息:)

+0

這真的很聰明,謝謝你在Opera上(我的列表中沒有試過)。該應用程序甚至已經有一個服務器端Node.js組件,並且您是對的,只需等待來回服務器,並從服務器獲得出色的建議,而不是立即從客戶端獲得平庸建議就更有意義。 –

1

從我的評論之後,我砍死在一起有點腳本來「收穫」可能出現的錯誤消息,並導致他們的模式。

JSFiddle(試圖在Chrome只,我希望正則表達式異常對象有其他瀏覽器結構相同)

的想法是這樣的:你有一個使用盡可能多的正則表達式的功能儘可能工作正則表達式。然後你隨機變異它(添加,刪除或交換字符)並嘗試編譯它。你可以做幾千次,並收集所有的錯誤信息。希望有機會比我們任何人都能提出可能的畸形模式。

你一定要提高基本模式,包括由JavaScript提供的所有正則表達式的功能,包括在替換表所有元字符。但除此之外,我似乎一直得到6個可能的錯誤消息:

Unterminated group 
Invalid group  
Nothing to repeat 
Unmatched ')' 
Unterminated character class 
\ at end of pattern 

嘗試在不同的瀏覽器中運行該腳本,分析導致錯誤的模式,並從那裏,你應該能夠編寫你的工具。

編輯:

好了,因爲我擔心,這並不在其他瀏覽器開箱的,因爲他們在其他地方保存異常對象內的實際消息。但從你們的問題來看,你們似乎已經發現,從哪裏得到每個瀏覽器的信息,所以我希望你們所做的改變應該很小。