2014-04-26 116 views
2

我有這樣的正則表達式:非轉義非ASCII字符的ASCII非-8BIT腳本

/\「(?>[^\「\」\\]+|\\{2}|\\.)*\」/ 

(與# -*- encoding : utf-8 -*-在我的文件),它運行,而無需在應用程序中的任何錯誤。當我使用brakeman寶石來檢查我的應用程序,它返回如下:

WARNING: invalid multibyte character: /\「(?>[^\「\」\\]+|\\{2}|\\.)*\」/ for "\\「(?>[^\\「\\」\\\\]+|\\\\{2}|\\\\.)*\\」" "" 

+Errors+ 
+------------------------------------------------------------------------------------------------------>> 
| Error                          >> 
+------------------------------------------------------------------------------------------------------->> 
| /.../n has a non escaped non ASCII character in non ASCII-8BIT script: /\「(?>[^\「\」\\]+|\\{2}|\\.)*\」/>> 
+------------------------------------------------------------------------------------------------------->> 

1)爲什麼會顯示警告? (是不是括號字符逃脫?)
2)如果我忽略警告會發生什麼不好的事情?
3)有無論如何改變我的代碼,使其達到相同的目標,但沒有這個問題?

回答

2

我對brakeman一無所知。但隨着你的文件是在UTF-8編碼,正則表達式的字節流讀取ASCII/ANSI與代碼頁的Windows 1252

/\「(?>[^\「\ã€\\]+|\\{2}|\\.)*\ã€/ 

這是與十六進制值

2F 5C E3 80 8C 28 3F 3E 5B 5E 5C E3 80 8C 5C E3 80 8D 5C 5C 5D 2B 7C 5C 5C 7B 32 7D 7C 5C 5C 2E 29 2A 5C E3 80 8D 2F 

由於如果字節流不是先從UTF-8轉換爲Unicode(通常是UTF-16 Little Endian),則可以看到有很多字符(字節)的代碼值大於十進制127(十六進制7F),而沒有反斜槓。

即使表達式應該在完整的Unicode範圍中查找字符,也可以將Perl正則表達式始終寫入沒有任何字符且代碼值大於127的字符。

在文本編輯器UltraEdit的腳本論壇中,有主題Creating a Perl regular expression string with ANSI/Unicode characters,它解釋瞭如何創建此類表達式,並且還包含指向UltraEdit腳本的鏈接,該腳本主要使用JavaScript代碼將正則表達式轉換爲ANSI或Unicode字符轉換爲使用它們的十六進制表示的表達式,因此僅使用ASCII字符。

在你的正則表達式使用內用UltraEdit這個UltraEdit的腳本中的Unicode字符前去除不必要backslahes後付諸剪貼板Perl的正則表達式字符串

/\x{300c}(?>[^\x{300c}\x{300d}\\]+|\\{2}|\\.)*\x{300d}/ 

對於Ruby腳本\u必須用來代替\x導致表達式:

/\u{300c}(?>[^\u{300c}\u{300d}\\]+|\\{2}|\\.)*\u{300d}/ 

而這正則表達式字符串應該找到與您的字符串,不通過0123產生任何警告,因爲它現在僅由代碼值小於128小數的ASCII字符組成。

+0

謝謝,這個工程。但是,ruby的語法是'\ u {''而不是'\ x'',所以如果您更新了包含該註釋的答案會很有幫助。 – diasks2