使用正则表达式根据用户名的最后字母更改文本

时间:2018-12-05 13:38:08

标签: ruby-on-rails ruby regex gsub

我希望根据用例更改用户名的结尾(在语言系统将运行的情况下,名称的结尾取决于使用方式)。

因此需要定义名称的所有结尾并定义它们的替换。 建议使用.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”?

谢谢

2 个答案:

答案 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代码中使用该属性的争论仍在持续,这主要是因为在何时没有键顺序的概念。哈希首先用于计算机程序。这个答案很好地说明了利用密钥顺序的好处。