【问题标题】:How to replace multiple substrings with same string using `gsub`如何使用`gsub`用相同的字符串替换多个子字符串
【发布时间】:2015-12-17 14:51:20
【问题描述】:

我想将不同的字符/子字符串更改为单个字符或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 做到这一点?

【问题讨论】:

  • nilNilClass 的实例,而不是String 的实例,因此您无法将子字符串转换为nil。您的意思是转换为单个字符或 空字符串.

标签: ruby string replace gsub


【解决方案1】:

to|an|a|the 是模式,您将其用作字符串。这里:

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

【讨论】:

  • |'to|an|a|the' 中是什么意思?
  • @ArupRakshit 符号“|”是匹配的。 'xa|bx'.gsub('a|b', 'c') #⇒ 'xcx'.
  • @mudasobwa 有道理.. 我认为这个| 分隔的字符串是正则表达式联合运算符.. Ruby 与其他方法有一些魔力,所以有点困惑:)
  • 可能是str.gsub(/\b(?:to|an|a|the)\b/, ''),这样"How to chop another onion"就被转换成"How chop another onion"了。
【解决方案2】:
▶ "How to chop an onion?".gsub(/'s|[?&]+|to|an|a|the/,'')
                         .downcase.split(/\s+/).join '-'
#⇒ "how-chop-onion"

【讨论】:

    【解决方案3】:

    首先列出你想做的事情:

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

    现在考虑执行这些操作的顺序。任何时候都可以转换为小写,但先做起来很方便,在这种情况下,正则表达式不需要区分大小写。应在某些单词之前删除标点符号,以便更容易地识别单词而不是子字符串。删除多余的空格显然必须在删除单词之后完成。因此,我们希望顺序是:

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

    在向下大小写之后,这可以通过三个链接的gsubs 来完成:

    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"
    

    请注意,如果没有 r2 中的分词 (\b),我们会得到:

    "plese don't y of you know how chop vcdo"
    

    另外,第一个 gsub 可以替换为:

    tr(',?','')
    

    或:

    delete(',?')
    

    这些gsubs 可以合二为一(我怎么写),如下:

    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"
    

    “Lookarounds”(此处为正向lookahead)通常被称为“零宽度”,这意味着虽然需要匹配,但它们不构成返回的匹配的一部分。

    1 你有没有想过“小写”和“大写”这两个词是从哪里来的?在印刷的早期,排字员将金属活字分为两种,一种位于另一种上方。用于句子和专有名词开头的较高字母的字母大写;其余的都是小写的。

    【讨论】:

    • 谢谢你!我确实面临过在单词中丢失“an”和“a”的问题。这有帮助:)
    猜你喜欢
    • 2020-08-31
    • 2015-11-09
    • 2013-08-17
    • 2013-09-05
    • 2015-04-01
    • 2017-12-06
    • 2011-09-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多