【问题标题】:Changing text based on the final letter of user name using regular expression使用正则表达式根据用户名的最后一个字母更改文本
【发布时间】:2019-05-07 02:26:58
【问题描述】:

我希望根据用例更改用户名的结尾(在语言系统中,名称的结尾取决于它的使用方式)。

因此需要定义名称的所有结尾并定义它们的替换。 建议使用 .gsub 正则表达式在字符串中搜索和替换:

Changing text based on the final letter of user name

"name surname".gsub(/e\b/, 'ai')

这会将 e 替换为 ai,因此“name surname = namai surnamai”。

如何在同一条记录上用于更多选项,例如:“e = ai, us = mi, i = as”?

谢谢

【问题讨论】:

  • @WiktorStribiżew 如果右侧有重叠的键,例如:eer,需要确保较长的键先出现...Regexp.union(h.keys.sort_by { |w| -w.length })

标签: ruby-on-rails ruby regex gsub


【解决方案1】:

您可以将String#gsub 与块一起使用。 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

【讨论】:

  • subgsub 也允许哈希作为替换参数。所以你可以使用s.gsub(/(e|us|i)$/, replacements)
  • 谢谢。应该在什么文件中定义?我正在研究 HTML.SLIM,所以我共享的代码和平用于 html.slim。有没有办法只在那个 html.slim 文件中配置它?
  • 我会在模型或助手中定义它,因为您应该避免在视图中放置复杂的逻辑。这也使得测试变得更加容易。
  • 这只是一个例子,您需要将硬编码的字符串替换为您的真实姓氏
  • 最好从哈希replacements 构造您的正则表达式,这样如果后者发生更改,您就不必手动更改您的正则表达式。此外,考虑到最多将执行一个字符串替换,gsub 的使用可能会让读者感到困惑。我建议改用sub
【解决方案2】:

@Sundeep 在对该问题的评论中做出了重要的观察。例如,如果替换是由以下哈希给出的:

g = {'e'=>'ai', 's'=>'es', 'us'=>'mi', 'i' => 'as'}
  #=> {"e"=>"ai", "s"=>"es", "us"=>"mi", "i"=>"as"}

'surnamus' 将被(错误地)转换为'surnamues',仅仅是因为's'=>'es'g 中位于'us'=>'mi' 之前。这种情况目前可能不存在,但在未来允许这种情况可能是谨慎的,特别是因为这样做非常简单:

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 代码中使用该属性仍存在争议,主要是因为在哈希首先用于计算机程序。这个答案提供了利用密钥顺序的好处的一个很好的例子。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2023-03-30
    • 2022-10-31
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多