How to backreference in Ruby regular [removed]regex) with gsub when I use grouping?

后端 未结 3 1657
花落未央
花落未央 2020-12-14 07:00

I would like to patch some text data extracted from web pages. sample:

t=\"First sentence. Second sentence.Third sentence.\"

There is no sp

相关标签:
3条回答
  • 2020-12-14 07:33

    If you got here because of Rubocop complaining "Avoid the use of Perl-style backrefs." about $1, $2, etc... you can can do this instead:

    some_id = $1
    # or
    some_id = Regexp.last_match[1] if Regexp.last_match
    
    some_id = $5
    # or
    some_id = Regexp.last_match[5] if Regexp.last_match
    

    It'll also want you to do

    %r{//}.match(some_string)
    

    instead of

    some_string[//]
    

    Lame (Rubocop)

    0 讨论(0)
  • 2020-12-14 07:48

    You can backreference in the substitution string with \1 (to match capture group 1).

    t = "First sentence. Second sentence.Third sentence!Fourth sentence?Fifth sentence."
    t.gsub(/([.!?])([A-Z1-9])/, "\\1\n\\2") # => "First sentence. Second sentence.\nThird sentence!\nFourth sentence?\nFifth sentence."
    
    0 讨论(0)
  • 2020-12-14 07:53
    • If you are using gsub(regex, replacement), then use '\1', '\2', ... to refer to the match. Make sure not to put double quotes around the replacement, or else escape the backslash as in Joshua's answer. The conversion from '\1' to the match will be done within gsub, not by literal interpretation.
    • If you are using gsub(regex){replacement}, then use $1, $1, ...

    But for your case, it is easier not to use matches:

    t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n")
    
    0 讨论(0)
提交回复
热议问题