我有一些包含Unicode转义序列的文本,例如\ u003C。这就是我想出来的东西:
string.gsub(/\u(....)/) {|m| [$1].pack("H*").unpack("n*").pack("U*")}
这是对的吗? (即它似乎与我的测试一起工作,但更有知识的人可以找到它的问题吗?)
答案 0 :(得分:17)
您的正则表达式/\u(....)/
存在一些问题。
首先,\u
不能按您认为的方式工作,在1.9中您会收到错误,而在1.8中它只匹配单个u
而不是{{} 1}}你正在寻找的对;您应该使用\u
来查找所需的文字/\\u/
。
其次,你的\u
群体过于宽松,这将允许任何四个角色通过,这不是你想要的。在1.9中,您需要(....)
(四个十六进制数字),但在1.8中您需要(\h{4})
,因为([\da-fA-F]{4})
是新事物。
因此,如果您希望正则表达式在1.8和1.9中都有效,则应使用\h
。这在1.8和1.9中给出了以下内容:
/\\u([\da-fA-F]{4})/