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 delreplacement
, o escapa de la barra invertida como en la respuesta de Joshua. La conversión de''/1''
a la coincidencia se realizará dentro degsub
, 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")