我希望根据用例更改用户名的结尾(在语言系统将运行的情况下,名称的结尾取决于使用方式)。
因此需要定义名称的所有结尾并定义它们的替换。 建议使用.gsub正则表达式搜索和替换字符串:
Changing text based on the final letter of user name
"name surname".gsub(/e\b/, 'ai')
这将用ai替换e,因此“姓氏= namai surnamai”。
如何在同一条记录中将其用于更多选项,例如:“ e = ai,us = mi,i = as”?
谢谢
答案 0 :(得分:4)
您可以将String#gsub
与block一起使用。 Docs说:
以块形式,将当前的匹配字符串作为参数传递,并将适当设置变量,例如$ 1,$ 2,$`,$&和$'。该块返回的值将替换为每次调用时的匹配项。
因此,您可以将正则表达式与要替换的所有子字符串串联使用,然后在块中替换它,例如使用将匹配项映射到替换项的哈希值。
完整示例:
replacements = {'e'=>'ai', 'us'=>'mi', 'i' => 'as'}
['surname', 'surnamus', 'surnami'].map do |s|
s.gsub(/(e|us|i)$/){|p| replacements[p] }
end
答案 1 :(得分:0)
@Sundeep在对该问题的评论中发表了重要意见。例如,如果替换是由以下哈希值给出的:
g = {'e'=>'ai', 's'=>'es', 'us'=>'mi', 'i' => 'as'}
#=> {"e"=>"ai", "s"=>"es", "us"=>"mi", "i"=>"as"}
'surnamus'
会(错误地)转换为'surnamues'
仅仅是因为's'=>'es'
在'us'=>'mi'
中位于g
之前。这种情况目前可能尚不存在,但是将来允许它是谨慎的,特别是因为这样做很简单:
h = g.sort_by { |k,_| -k.size }.to_h
#=> {"us"=>"mi", "e"=>"ai", "s"=>"es", "i"=>"as"}
arr = ['surname', 'surnamus', 'surnami', 'surnamo']
可以使用String@#sub的形式进行替换,该形式采用哈希作为第二个参数。
r = /#{Regexp.union(h.keys)}\z/
#=> /(?-mix:us|e|s|i)\z/i
arr.map { |s| s.sub(r,h) }
#=> ["surnamai", "surnammi", "surnamas", "surnamo"]
另请参阅Regexp::union。
顺便说一句,尽管从Ruby v1.9开始就保证了哈希键的插入顺序,但是关于是否应在Ruby代码中使用该属性的争论仍在持续,这主要是因为在何时没有键顺序的概念。哈希首先用于计算机程序。这个答案很好地说明了利用密钥顺序的好处。