How do I remove all characters in a string until a substring is matched, in Ruby?

后端 未结 7 924
时光说笑
时光说笑 2021-02-13 16:48

Say I have a string: Hey what\'s up @dude, @how\'s it going?

I\'d like to remove all the characters before@how\'s.

相关标签:
7条回答
  • 2021-02-13 17:28
    >> "Hey what's up @dude, @how's it going?".partition("@how's")[-2..-1].join
    => "@how's it going?"
    

    Case insensitive

    >> "Hey what's up @dude, @HoW's it going?".partition(/@how's/i)[-2..-1].join
    => "@HoW's it going?"
    

    Or using scan()

    >> "Hey what's up @dude, @HoW's it going?".scan(/@how's.*/i)[0]
    => "@HoW's it going?"
    
    0 讨论(0)
  • 2021-02-13 17:34

    You can also directly call [] also on a string(same as slice)

    s = "Hey what's up @dude, @how's it going?"
    start_index = s.downcase.index("@how")
    start_index ? s[start_index..-1] : ""
    
    0 讨论(0)
  • 2021-02-13 17:37

    Use String#slice

    s = "Hey what's up @dude, @how's it going?"
    s.slice(s.index("@how")..-1)
    # => "@how's it going?"
    
    0 讨论(0)
  • 2021-02-13 17:39

    or with the regex:

    str = "Hey what's up @dude, @how's it going?"
    str.gsub!(/.*?(?=@how)/im, "") #=> "@how's it going?"
    

    you can read about lookaround at here

    0 讨论(0)
  • 2021-02-13 17:43

    String#slice and String#index work fine but will blow up with ArgumentError: bad value for range if the needle is not in the haystack.

    Using String#partition or String#rpartition might work better in that case:

    s.partition "@how's"
    # => ["Hey what's up @dude, ", "@how's", " it going?"]
    s.partition "not there"
    # => ["Hey what's up @dude, @how's it going?", "", ""]
    s.rpartition "not there"
    # => ["", "", "Hey what's up @dude, @how's it going?"]
    
    0 讨论(0)
  • 2021-02-13 17:44

    There are literally tens of ways of doing this. Here are the ones I would use:

    If you want to preserve the original string:

    str = "Hey what's up @dude, @how's it going?"
    str2 = str[/@how's.+/mi]
    p str, str2
    #=> "Hey what's up @dude, @how's it going?"
    #=> "@how's it going?"
    

    If you want to mutate the original string:

    str = "Hey what's up @dude, @how's it going?"
    str[/\A.+?(?=@how's)/mi] = ''
    p str
    #=> "@how's it going?"
    

    ...or...

    str = "Hey what's up @dude, @how's it going?"
    str.sub! /\A.+?(?=@how's)/mi, ''
    p str
    #=> "@how's it going?"
    

    You need the \A to anchor at the start of the string, and the m flag to ensure that you are matching across multiple lines.

    Perhaps simplest of all for mutating the original:

    str = "Hey what's up @dude, @how's it going?"
    str.replace str[/@how's.+/mi]
    p str
    #=> "@how's it going?"
    
    0 讨论(0)
提交回复
热议问题