Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从字符串中删除某些单词,但仅当它们出现在字符串末尾时才删除?_Ruby_Regex - Fatal编程技术网

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"]