regulares regexp palabras numeros mayusculas hacer funcion expresiones crear contar comparar como cadenas ruby regex reference gsub backreference

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



numeros en ruby (3)

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 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)


  • 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")