无法用 gsub 替换字符
impossible to replace the character with gsub
我们导入了一个文件,在文件中有一个特殊的坑,首先我尝试了编码方法和解码 ruby 但没有任何反应,所以我使用了 gsub。
作为字符组 Ì©
和 ̤
工作
其他没问题换我
此处方法替换
def replace_chars(name)
chars = {
"Ž" => 'é',
"Â" => "ç",
"‘" => "ë",
"â„¢" => "ô",
"̤" => "ç",
"Ì©" => "é",
"•" => "ï"
}
puts "before #{name}"
chars.each do |key,value|
name.gsub!(key,value)
end
puts "after #{name}"
end
如果我但我的方法
replace_chars('̤liver Žponime')
这里是方法的输出,第一次他没有成功更改单词,但第二次他已经进行了更改。
输出:after ÃŒç¤liver éponime
我不明白他为什么不想接我的角色̤
和Ì©
。
将您的代码替换为:
def replace_chars(name)
chars = {
"̤" => "ç",
"Ì©" => "é",
"•" => "ï",
"â„¢" => "ô",
"Ž" => 'é',
"‘" => "ë",
"Â" => "ç"
}
puts "before #{name}"
chars.each do |key,value|
name.gsub!(key,value)
end
puts "after #{name}"
end
replace_chars('̤liver Žponime')
before ̤liver Žponime
after çliver éponime
这是另一种解决方案,可以避免迭代所有字符并替换匹配项。 @Prashant4020 是正确的,您需要按长度降序排列键,或者至少在执行此操作之前按长度对键进行排序,因为 Â
现在将匹配并替换 ̤
。
def replace_chars(name
chars = {
"̤" => "ç",
"Ì©" => "é",
"•" => "ï",
"â„¢" => "ô",
"Ž" => 'é',
"‘" => "ë",
"Â" => "ç"
}
#name.gsub!(/#{chars.keys.join('|')}/,chars)
#as suggested by @steenslag Regexp::union is definitely less of a hack
name.gsub!(Regexp.union(chars.keys),chars)
#translates to name.gsub!(/̤|Ì©"|•|â„¢|Ž|‘|Â/,{"̤" => "ç","Ì©"=>"é","•"=>"ï","â„¢"=>"ô","Ž"=>'é',"‘"=>"ë","Â"=>"ç"})
end
这将创建一个正则表达式,它将匹配 chars
散列中的键,然后使用这些值替换键。这样 gsub!
将不会为根本不存在于 name
中的键调用。
我们导入了一个文件,在文件中有一个特殊的坑,首先我尝试了编码方法和解码 ruby 但没有任何反应,所以我使用了 gsub。
作为字符组 Ì©
和 ̤
工作
其他没问题换我
此处方法替换
def replace_chars(name)
chars = {
"Ž" => 'é',
"Â" => "ç",
"‘" => "ë",
"â„¢" => "ô",
"̤" => "ç",
"Ì©" => "é",
"•" => "ï"
}
puts "before #{name}"
chars.each do |key,value|
name.gsub!(key,value)
end
puts "after #{name}"
end
如果我但我的方法
replace_chars('̤liver Žponime')
这里是方法的输出,第一次他没有成功更改单词,但第二次他已经进行了更改。
输出:after ÃŒç¤liver éponime
我不明白他为什么不想接我的角色̤
和Ì©
。
将您的代码替换为:
def replace_chars(name)
chars = {
"̤" => "ç",
"Ì©" => "é",
"•" => "ï",
"â„¢" => "ô",
"Ž" => 'é',
"‘" => "ë",
"Â" => "ç"
}
puts "before #{name}"
chars.each do |key,value|
name.gsub!(key,value)
end
puts "after #{name}"
end
replace_chars('̤liver Žponime')
before ̤liver Žponime
after çliver éponime
这是另一种解决方案,可以避免迭代所有字符并替换匹配项。 @Prashant4020 是正确的,您需要按长度降序排列键,或者至少在执行此操作之前按长度对键进行排序,因为 Â
现在将匹配并替换 ̤
。
def replace_chars(name
chars = {
"̤" => "ç",
"Ì©" => "é",
"•" => "ï",
"â„¢" => "ô",
"Ž" => 'é',
"‘" => "ë",
"Â" => "ç"
}
#name.gsub!(/#{chars.keys.join('|')}/,chars)
#as suggested by @steenslag Regexp::union is definitely less of a hack
name.gsub!(Regexp.union(chars.keys),chars)
#translates to name.gsub!(/̤|Ì©"|•|â„¢|Ž|‘|Â/,{"̤" => "ç","Ì©"=>"é","•"=>"ï","â„¢"=>"ô","Ž"=>'é',"‘"=>"ë","Â"=>"ç"})
end
这将创建一个正则表达式,它将匹配 chars
散列中的键,然后使用这些值替换键。这样 gsub!
将不会为根本不存在于 name
中的键调用。