如何从字符串中删除某些单词,但仅当它们出现在字符串的末尾时?

时间:2013-11-07 19:44:26

标签: ruby regex

我的公司名称有“The Millard Group”和“The Chimney Corporation”。我想删除像“Group”或“Corporation”这样的词,但前提是它们出现在单词的最末端。即如果它们出现在中间某处,我不想删除它们。

我如何在Ruby中执行此操作? gsub将从任何地方替换字符串,并且我有一个大约十的列表,所以我宁愿不运行gsub十次。如果我能提供一系列要删除的单词,那就太棒了。

4 个答案:

答案 0 :(得分:5)

尝试这样的事情:

['The Millard Group', 'The Chimney Corporation'].each do |s|
  s.gsub!(/\ (Group|Corporation)$/, '')
end

您可以在更多|

之后添加更多要在正则表达式中删除的单词

答案 1 :(得分:2)

因为不是所有东西都需要用gsub和regexp来解决:

endings = [' Group', ' Corporation']
corporations = ["The Millard Group", "The Chimney Corporation"]

corporations.each do |corp|
  endings.each{|ending| corp.chomp!(ending)}
end

p corporations #=> ["The Millard", "The Chimney"]

编辑:也许这个版本可能会快一点?

corporations.map! do |corp|
  last_word = (corp.rindex(' ')+1)..-1
  corp.slice!(last_word) if endings.include?(corp[last_word])
  corp.rstrip
end

答案 2 :(得分:0)

使用以下惯例:

\s用于空格/换行等。
$表示行尾。 ^表示行首。

现在在正则表达式中使用它:

/\s*(Group|Corporation)$/

这将在您给定的String结尾处找到公司,并将其替换为您想要的任何内容。

'The Chimney Corporation'.gsub!(/\s*(Group|Corporation)$/,'')
#=>"The Chimney"

答案 3 :(得分:0)

arr = [ "The Millard Group", "The Chimney Corporation", "The Ruby People" ]
BAD_WORDS = %w{ Group Corporation }

arr.reduce([]) do |a,s| 
  s.match( /(.*?)\s+(\w+)\s*$/ )
  a << ( BAD_WORDS.include?($2) ? $1 : s )
end
    # => ["The Millard", "The Chimney", "The Ruby People"] 
  • arr.reduce([])在块中创建一个名为a的空数组,可以在其中插入可能修改的字符串。

  • s.match(/(.*?)\s+(\w+)\s*$/)有两个捕获组;第二个用于字符串的最后一个单词(\w+),前面至少有一个空格字符\s+,第一个字符串用于该空格之前的所有内容,(.*?),{ {1}}需要让它“非贪婪”。匹配结果存储在?$1

  • 我们会检查$2中是否包含$2(字符串s的最后一个字);如果是,我们会将BAD_WORDS追加到$1,否则我们会追加 整个字符串a

[编辑:我更喜欢迄今为止发布的其他解决方案,但这样做会留下多样性。]