我的公司名称有“The Millard Group”和“The Chimney Corporation”。我想删除像“Group”或“Corporation”这样的词,但前提是它们出现在单词的最末端。即如果它们出现在中间某处,我不想删除它们。
我如何在Ruby中执行此操作? gsub
将从任何地方替换字符串,并且我有一个大约十的列表,所以我宁愿不运行gsub
十次。如果我能提供一系列要删除的单词,那就太棒了。
答案 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
。
[编辑:我更喜欢迄今为止发布的其他解决方案,但这样做会留下多样性。]