非ASCII-8BIT脚本中的非转义非ASCII字符



我有这个正则表达式:

/「(?>[^「」\]+|\{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) 有没有办法更改我的代码,使其达到相同的目标,但没有这个问题?

我对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)的"字符"(字节)之前没有反斜杠。

编写Perl正则表达式时可以始终不包含任何代码值大于127的字符,即使表达式应该在完整的Unicode范围内找到字符。

在文本编辑器UltraEdit的脚本论坛中,有一个主题"创建具有ANSI/Unicode字符的Perl正则表达式字符串",它解释了如何创建这样的表达式,并包含一个指向UltraEdit脚本的链接,该脚本主要使用JavaScript代码将内部具有ANSI或Unicode字符的正则表达式转换为使用十六进制的表达式表示,因此只有ASCII字符。

在将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字符组成。

相关内容

  • 没有找到相关文章

最新更新