2

我有这个正则表达式:

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

# -*- encoding : utf-8 -*-在我的文件中),它在我的应用程序中运行没有任何错误。当我使用brakemangem 检查我的应用程序时,它返回以下内容:

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) 无论如何要更改我的代码以实现相同的目标但没有这个问题?

4

1 回答 1

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 字符。

在 Unicode 字符将 Perl 正则表达式字符串放入剪贴板之前删除不必要的反斜杠后,在 UltraEdit 中对正则表达式使用此 UltraEdit 脚本

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

对于\u必须使用 Ruby 脚本而不是\x导致表达式:

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

并且这个正则表达式字符串应该与您的字符串相同而不会产生任何警告,brakeman因为它现在只包含代码值小于十进制 128 的 ASCII 字符。

于 2014-04-26T14:52:48.247 回答