Is there a function like String#scan, but returning array of MatchDatas?

前端 未结 4 1378
名媛妹妹
名媛妹妹 2021-02-04 18:18

I need a function to return all matches of a regexp in a string and positions at which the matches are found (I want to highlight matches in the string).

There

相关标签:
4条回答
  • 2021-02-04 18:35

    I think at least you can enhance your code a bit:

    matches = []
    while(match = str.match(regexp)) 
      matches << match
      str = match.post_match
    end
    
    0 讨论(0)
  • 2021-02-04 18:55

    Use the captures method on a successful match.

    "foobar".match(/(f)(oobar)/).captures
    

    => ["f,""oobar"]

    0 讨论(0)
  • 2021-02-04 18:58

    Do you really need the position or is it enough to replace the matches on the fly?

    s="I'mma let you finish but Beyonce had one of the best music videos of all time!"
    s.gsub(/(Beyonce|best)/, '<b>\1</b>')
    

    => "I'mma let you finish but Beyonce had one of the best music videos of all time!"

    0 讨论(0)
  • 2021-02-04 18:59

    If you just need to iterate over the MatchData objects you can use Regexp.last_match in the scan-block, like:

    string.scan(regex) do
      match_data = Regexp.last_match
      do_something_with(match_data)
    end
    

    If you really need an array, you can use:

    require 'enumerator' # Only needed for ruby 1.8.6
    string.enum_for(:scan, regex).map { Regexp.last_match }
    
    0 讨论(0)
提交回复
热议问题