2015-12-17 61 views
1

我想將不同的字符串/子字符串更改爲單個字符或nil。我想將"How to chop an onion?"更改爲"how-chop-onion"如何使用`gsub`替換多個具有相同字符串的子字符串

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

使用管道字符|不起作用。我怎樣才能做到這一點gsub

+0

'nil'是'NilClass'的一個實例,不是'String'的實例,所以你不能將一個子串轉換爲'nil'。你的意思是轉換爲單個字符或一個*空字符串*。 –

回答

6

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

這個'|'在| an | a | the''中的含義是什麼? –

+1

@ArupRakshit符號「|」被匹配。 ''xa | bx'.gsub('a | b','c')#⇒'xcx''。 – mudasobwa

+0

@mudasobwa是有道理的..我認爲這個'''分開的字符串是Regexp聯合操作符.. Ruby有其他方法的一些魔法,所以有點困惑:) –

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

高效!謝謝:) –

2

開始通過製作你想要做什麼的清單:

  • 刪除某些文字
  • 刪除某些標點符號
  • 刪除多餘的空格之後的話被刪除
  • 轉換爲小寫字母

現在想想這些操作應該執行的順序。可以隨時進行小寫轉換,但首先要做到這一點很方便,在這種情況下,正則表達式不一定是大小寫無關的。標點符號應該在某些單詞之前被刪除,以便更容易識別單詞而不是子字符串。顯然,刪除多餘的空格必須在刪除單詞後完成。因此,我們希望的順序爲:單詞被刪除

後下套管後

  • 轉換爲小寫
  • 刪除某些標點符號
  • 刪除某些文字
  • 刪除多餘的空格,這可以用三個鏈接來完成gsub s:

    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),我們會得到:

    tr(',?','') 
    

    或:

    delete(',?') 
    

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

    此外,第一gsub可以被替代

    這些gsub s可以合併成一個(我怎麼寫它),如下所示:

    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」(在此爲正超前)常常稱爲「零寬度」,這意味着,當比賽是必需的,它們不形成返回的匹配的一部分。

    1你有沒有想過術語「小寫」和「大寫」來自哪裏?在印刷的早期,排版員將金屬可移動類型分爲兩種情況,一種位於另一種上方。那些用於開始句子和專有名詞的較高字母的字母大寫,其餘的是小寫字母。

+0

謝謝你!我確實面臨着用文字丟失'an'和'a'的問題。這有助於:) –

相關問題