with starts regular one end regex language-agnostic line-breaks

regular - regex starts with



¿Coincidir con saltos de línea-/ n o / r / n? (5)

Mientras escribía esta respuesta , tuve que hacer coincidir exclusivamente en saltos de línea en lugar de usar s -flag ( dotall - dot match linebreaks).

Los sitios que se usan generalmente para probar expresiones regulares se comportan de manera diferente cuando intentan coincidir en /n o /r/n .

Me di cuenta

  • Regex101 coincide con saltos de línea solo en /n
    ( example - eliminar /r coincide)

  • RegExr no coincide con los saltos de línea ni en /n ni en /r/n
    y no puedo encontrar algo que haga que coincida con un salto de línea, excepto para m -flag y /s
    ( ejemplo )

  • Debuggex se comporta aún más diferente:
    en este ejemplo , solo coincide con /r/n , mientras que
    here solo coincide en /n , con las mismas banderas y motor especificados

Soy plenamente consciente de la m -flag (multiline - hace que ^ coincida con el inicio y $ el final de una línea), pero a veces esto no es una opción. Lo mismo con /s , ya que coincide con las pestañas y los espacios, también.

Mi idea de usar el carácter de nueva línea de Unicode ( /u0085 ) no tuvo éxito, así que:

  1. ¿Existe una forma segura de integrar la coincidencia en un salto de línea (preferiblemente sin importar el idioma utilizado) en una expresión regular?
  2. ¿Por qué los sitios mencionados anteriormente se comportan de manera diferente (especialmente Debuggex, que coinciden solo una vez en /n y una vez solo en /r/n )?

En Python:

# as Peter van der Wal''s answer re.split(r''/r/n|/r|/n'', text, flags=re.M)

o más riguroso:

# https://docs.python.org/3/library/stdtypes.html#str.splitlines str.splitlines()


En notepad ++ / R coincide con / n y / r / n.


Esto solo se aplica a la pregunta 1.

Tengo una aplicación que se ejecuta en Windows y utiliza un cuadro de editor de MFC multilínea.
La caja del editor espera linebreaks CRLF, pero necesito analizar el texto enterrado
con algunos regexs realmente grandes / desagradables ''.

No quería estresarme al escribir la expresión regular, así que
Terminé normalizando entre el analizador y el editor para que
las expresiones regulares solo usan /n . También atrapo las operaciones de pegado y las convierto para las cajas.

Esto no lleva mucho tiempo.
Esto es lo que yo uso.

boost::regex CRLFCRtoLF ( " //r//n | //r(?!//n) " , MODx); boost::regex CRLFCRtoCRLF ( " //r//n?+ | //n " , MODx); // Convert (All style) linebreaks to linefeeds // --------------------------------------- void ReplaceCRLFCRtoLF( string& strSrc, string& strDest ) { strDest = boost::regex_replace ( strSrc, CRLFCRtoLF, "//n" ); } // Convert linefeeds to linebreaks (Windows) // --------------------------------------- void ReplaceCRLFCRtoCRLF( string& strSrc, string& strDest ) { strDest = boost::regex_replace ( strSrc, CRLFCRtoCRLF, "//r//n" ); }


Tiene diferentes finales de línea en los textos de ejemplo en Debuggex. Lo que es especialmente interesante es que Debuggex parece haber identificado qué estilo de final de línea utilizó primero, y convierte todos los finales de línea adicionales ingresados ​​a ese estilo.

Utilicé Notepad ++ para pegar texto de muestra en formato Unix y Windows en Debuggex, y lo que pegue primero es con lo que se pegó esa sesión de Debuggex.

Por lo tanto, debe lavar su texto a través de su editor de texto antes de pegarlo en Debuggex. Asegúrate de que estás pegando el estilo que deseas. Debuggex utiliza por defecto el estilo Unix (/ n).

Además, NEL (/ u0085) es algo completamente diferente: https://en.wikipedia.org/wiki/Newline#Unicode

(/r?/n) cubrirá Unix y Windows. Necesitará algo más complejo, como (/r/n|/r|/n) , si también quiere hacer coincidir la vieja Mac.


Voy a responder en dirección opuesta;)

2) Para obtener una explicación completa acerca de / ry / n, debo referirme a esta pregunta, que es mucho más completa de lo que voy a publicar aquí: ¿ Diferencia entre / ny / r?

En pocas palabras, Linux usa / n para una nueva línea, Windows / r / ny viejas Macs / r. Así que hay múltiples formas de escribir una nueva línea. Su segunda herramienta (RegExr), por ejemplo, coincide en la única / r.

1) [/r/n]+ como Ilya sugirió que funcionará, pero también coincidirá con varias líneas nuevas consecutivas. (/r/n|/r|/n) es más correcto.