![](/img/trans.png)
[英]How to replace all characters but for the first and last two with gsub Ruby
[英]How to replace multibyte characters in ruby using gsub?
我在MongoDB中使用Mongoid保存记录时遇到问题,因为它们包含多字节字符。 这是字符串:
a="Chris \xA5\xEB\xAE\xDFe\xA5"
我首先将它转换为BINARY,然后我像这样gsub
:
a.force_encoding("BINARY").gsub(0xA5.chr,"oo")
......工作正常:
=> "Chris oo\xEB\xAE\xDFeoo"
但是如果我使用Regexp
,似乎我不能使用chr
方法:
a.force_encoding("BINARY").gsub(/0x....?/.chr,"")
NoMethodError: undefined method `chr' for /0x....?/:Regexp
有同样问题的人吗?
非常感谢...
你可以用插值来做到这一点
a.force_encoding("BINARY").gsub(/#{0xA5.chr}/,"")
给
"Chris \xEB\xAE\xDFe"
编辑:根据评论,这里的版本将二进制编码字符串转换为ascii表示,并对该字符串执行正则表达式
a.unpack('A*').to_s.gsub(/\\x[A-F0-9]{2}/,"")[2..-3] #=>"Chris "
[2 ..- 3]最后是摆脱开头[“和尾随”]
注意:要摆脱你也可以使用的特殊字符
a.gsub(/\W/,"") #=> "Chris"
实际字符串不包含文字字符\\ xA5:这就是如何向您显示否则将无法打印的字符(类似于字符串包含换行符ruby时显示的情况)。
如果你想改变任何非ascii的东西,你可以这样做
a="Chris \xA5\xEB\xAE\xDFe\xA5"
a.force_encoding('BINARY').encode('ASCII', :invalid => :replace, :undef => :replace, :replace => 'oo')
这首先强制字符串为二进制编码(您总是希望以字符串对其编码有效的字符串开始。二进制文件始终有效,因为它可以包含任意字节)。 然后它将其转换为ASCII。 通常这会引发错误,因为有些字符不知道该怎么做但我们传递的额外选项告诉它用字符'oo'替换无效/未定义的序列
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.