我最近創建了一個C++ 11 std :: regex的實現,它通過了許多一致性測試。由於C++ 11 std :: regex的語法和語義來源於ECMAScript 5.1,所以我想我會在瀏覽器上運行相同的測試,以檢查行爲是否匹配。如何處理無效的正則表達式轉義?
我在處理無效轉義序列時發現了一些奇怪的差異。
/* As expected, matching the standard: */
/\,/.exec(",") -> [","]
/* Err... this should throw, it doesn't match any ECMAScript production:
IdentityEscape := SourceCharacter but not IdentifierPart (ES 5.1)
SourceCharacter but not UnicodeIDContinue (ES 6.0) */
/\z/.exec("z") -> ["z"] (Chrome & Firefox!)
/* It even works for characters that have a defined meaning: */
/\u/.exec("u") -> ["u"] (Chrome)
null (Firefox)
/* Errr...! This is creepiest, it matches a backslash!!! */
/\c/.exec("\\c") -> ["\c"] (Chrome & Firefox!)
這些已知的符合性問題在Chrome和Firefox中,還是符合一些以前/未來的ECMAScript行爲?
我會接受答案,但爲了記錄,就我個人而言,ECMAScript規範定義了瀏覽器的「正確」,而不是PCRE的行爲 - 也不關心「應該是「錯誤。 ECMAScript 6中規範附錄B的鏈接解釋了瀏覽器正在做什麼(即它是ECMAScript 5的故意違反,隨後作爲ES6中允許的行爲添加)。 –