我有这个正则表达式:
/\「(?>[^\「\」\\]+|\\{2}|\\.)*\」/
(我的文件中有# -*- encoding : utf-8 -*-
),在我的应用程序中运行时没有任何错误。当我使用brakeman
gem检查我的应用程序时,它返回以下内容:
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)无论如何都要改变我的代码,以便实现相同的目标,但没有这个问题吗?
答案 0 :(得分: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
正如你所看到的,有很多"字符" (字节)代码值大于127十进制(十六进制7F),如果字节流没有先从UTF-8转换为Unicode(通常是UTF-16 Little Endian)之前没有反斜杠。
即使表达式应该在完整的Unicode范围内找到字符,也可以编写Perl正则表达式,而不使用代码值大于127的任何字符。
在文本编辑器UltraEdit的脚本论坛中,有一个主题Creating a Perl regular expression string with ANSI/Unicode characters,它解释了如何创建这样的表达式,并且还包含一个指向UltraEdit脚本的链接,该脚本主要使用JavaScript代码将正则表达式转换为ANSI或表达式中的Unicode字符使用十六进制表示形式,因此只有ASCII字符。
在Unicode字符放入剪贴板Perl正则表达式字符串
之前,在删除不必要的后向字符后,在正则表达式的UltraEdit中使用此UltraEdit脚本/\x{300c}(?>[^\x{300c}\x{300d}\\]+|\\{2}|\\.)*\x{300d}/
对于Ruby脚本,必须使用\u
而不是\x
来生成表达式:
/\u{300c}(?>[^\u{300c}\u{300d}\\]+|\\{2}|\\.)*\u{300d}/
此正则表达式字符串应该与您的字符串相同而不会产生brakeman
的任何警告,因为它现在只包含代码值小于128十进制的ASCII字符。