Ruby 如何从字符串中删除某些单词,但仅当它们出现在字符串末尾时才删除?
我有像“米勒德集团”和“烟囱公司”这样的公司名称。我想删除像“集团”或“公司”这样的词,但前提是它们出现在单词的末尾。也就是说,如果它们出现在中间,我不想删除它们。Ruby 如何从字符串中删除某些单词,但仅当它们出现在字符串末尾时才删除?,ruby,regex,Ruby,Regex,我有像“米勒德集团”和“烟囱公司”这样的公司名称。我想删除像“集团”或“公司”这样的词,但前提是它们出现在单词的末尾。也就是说,如果它们出现在中间,我不想删除它们。 我怎样才能用Ruby做这件事呢gsub将替换任何位置的字符串,而且我有一个大约十个的列表,所以我不希望运行gsub十次。如果我能提供一个要删除的单词数组,那就太好了。试试这样的方法: ['The Millard Group', 'The Chimney Corporation'].each do |s| s.gsub!(/\ (
我怎样才能用Ruby做这件事呢
gsub
将替换任何位置的字符串,而且我有一个大约十个的列表,所以我不希望运行gsub
十次。如果我能提供一个要删除的单词数组,那就太好了。试试这样的方法:
['The Millard Group', 'The Chimney Corporation'].each do |s|
s.gsub!(/\ (Group|Corporation)$/, '')
end
通过在“更多”之后添加更多单词,可以在正则表达式中添加更多要删除的单词。请使用以下约定:
\s
用于空格/新行等$
表示在行尾。
^
表示行的开头
现在在正则表达式中使用此选项:
/\s*(Group|Corporation)$/
这将在给定的字符串的末尾找到集团或公司
,并将其替换为您想要的任何内容
'The Chimney Corporation'.gsub!(/\s*(Group|Corporation)$/,'')
#=>"The Chimney"
因为并非所有问题都需要使用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
arr=[“米拉德集团”、“烟囱公司”、“红宝石人”]
坏词=%w{集团公司}
arr.reduce([])do | a,s |
s、 匹配(/(.*)\s+(\w+)\s*$/)
a[“磨坊”、“烟囱”、“红宝石人”]
在块内创建一个名为arr.reduce([])
的空数组,可能修改的字符串将插入其中a
有两个捕获组;第二个用于字符串的最后一个字,s.match(/(.*?)\s+(\w+)\s*$/)
,前面至少有一个空格字符(\w+)
,第一个用于该空格前面的所有字符,\s+
,(.*?
,使其成为“非贪婪”字符。匹配结果存储在?
和$1
中$2
- 我们检查
(字符串$2
的最后一个单词)是否包含在s
坏单词中;如果是,我们将
追加到$1
,否则我们追加 整个字符串a
s
[编辑:我更喜欢到目前为止发布的其他解决方案,但出于多样性的考虑,我会保留它。]小心
$
,它实际上意味着“行结束”,“code>\z和\z
意味着“字符串结束”(对最后一行的处理不同)。@Ringo,如果这是对您的问题的最佳有效答案,请你给它打勾(或任何一个最好的问题)好吗?这将向找到您的问题的其他人显示哪个答案对您有帮助。您是指字尾、行尾还是字符串?请使用\s+
而不是\s*
。第一个强制剥离1+个空格字符,这将允许gsub
仅在单词单独出现时触发。使用\s*
将允许0+,即使在前面的单词后面附加了“Corporation”或“Group”,这可能会导致误报。虽然这更简单,更容易阅读,但随着列表的增长,使用包含搜索词并集的正则表达式模式会更快,尤其是在锚定时。非常好,@hirolau,非常好。我似乎总是把chomp
与gets.chomp
联系起来,忘记了它可以接受参数。一个很好的提醒。也许插入rstrip代码>在corp
之后。
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"]