如何使用`gsub`替换具有相同字符串的多个子字符串

时间:2015-12-17 14:51:21

标签: ruby string replace gsub

我想将不同的字符/子字符串更改为单个字符或nil。我想将"How to chop an onion?"更改为"how-chop-onion"

string
.gsub(/'s/,'')
.gsub(/[?&]/,'')
.gsub('to|an|a|the','')
.split(' ')
.map { |s| s.downcase}
.join '-'

使用竖线字符|不起作用。如何使用gsub

执行此操作

3 个答案:

答案 0 :(得分:8)

to|an|a|the是模式,您将它用作String。这里:

str.gsub('to|an|a|the', '')   # passing string argument
#=> "How to chop an onion?"

str.gsub(/to|an|a|the/, '')   # passing pattern argument
#=> "How  chop  onion?"

答案 1 :(得分:2)

▶ "How to chop an onion?".gsub(/'s|[?&]+|to|an|a|the/,'')
                         .downcase.split(/\s+/).join '-'
#⇒ "how-chop-onion"

答案 2 :(得分:2)

首先列出你想要做的事情:

  • 删除某些字词
  • 删除某些标点符号
  • 删除字词后删除多余的空格
  • 转换为小写 1

现在考虑应该执行这些操作的顺序。转换为小写可以随时进行,但首先执行它很方便,在这种情况下,正则表达式不需要无关紧要。在某些单词之前应删除标点符号,以便更容易识别单词而不是子字符串。显然必须在删除单词后删除多余的空格。因此,我们希望订单为:

  • 转换为小写
  • 删除某些标点符号
  • 删除某些字词
  • 删除字词后删除多余的空格

在下壳后,可以使用三个链式str = "Please, don't any of you know how to chop an avacado?" r1 = /[,?]/ # match a comma or question mark r2 = / \b # match a word break (?: # start a non-capture group to|an|a|the # match one of these words (checking left to right) ) # end non-capture group \b # match a word break /x # extended/free-spacing regex definition mode r3 = /\s\s/ # match two whitespace characters str.downcase.gsub(r1,'').gsub(r2,'').gsub(r3,' ') #=> "please don't any of you know how chop avacado" s来完成:

\b

请注意,如果r2中没有单词break("plese don't y of you know how chop vcdo" ),我们就会得到:

gsub

此外,第一个tr(',?','') 可以替换为:

delete(',?')

或:

gsub

这些r = / [,?] # as in r1 | # or \b(?:to|an|a|the)\b # as in r2 | # or \s # match a whitespace char (?=\s) # match a whitespace char in a postive lookahead /x str.downcase.gsub(r,'') #=> "please don't any of you know how chop avacado" 可以组合成一个(我怎么写),如下所示:

{{1}}

" Lookarounds" (这里是一个积极的前瞻)通常被称为"零宽度",这意味着,虽然匹配是必需的,但它们不构成返回的匹配的一部分。

1你有没有想过条款"小写" "大写"来自?在印刷的早期,排版机将金属可移动型保持在两种情况下,一种位于另一种之上。那些用于开始句子和专有名词的较高字母属于大写字母;其余的是小写的。