¿Cómo hacer una referencia inversa en la expresión regular de Ruby (expresiones regulares) con gsub cuando uso la agrupación?

Me gustaría parchear algunos datos de texto extraídos de páginas web. muestra:

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

No hay espacio después del punto al final de la segunda oración. Esto me indica que la tercera oración estaba en una línea separada (después de una etiqueta br) en el documento original.

Quiero usar esta expresión regular para insertar el carácter “\ n” en los lugares adecuados y parchear mi texto. Mi expresión regular:

 t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2) 

Pero desafortunadamente no funciona: “NoMethodError: método indefinido` + ‘para nil: NilClass “¿Cómo puedo hacer una referencia correcta a los grupos coincidentes? Fue tan fácil en Microsoft Word, solo tuve que usar los símbolos \ 1 y \ 2.

Puede hacer una referencia inversa en la cadena de sustitución con \1 (para hacer coincidir el grupo de captura 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." 
  • Si está utilizando gsub(regex, replacement) , use '\1' , '\2' , … para referirse a la coincidencia. Asegúrate de no colocar comillas dobles alrededor del replacement , o escapa de la barra invertida como en la respuesta de Joshua. La conversión de '\1' a la coincidencia se realizará dentro de gsub , no por interpretación literal.
  • Si está utilizando gsub(regex){replacement} , use $1 , $1 , …

Pero para tu caso, es más fácil no usar coincidencias:

 t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n") 

Si llegó aquí debido a que Rubocop se quejó “Evite el uso de backrefs de estilo Perl”. alrededor de $ 1, $ 2, etc … puedes hacer esto en su lugar:

 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 

También querrá que hagas

 %r{//}.match(some_string) 

en lugar de

 some_string[//] 

Lame (Rubocop)

Intereting Posts