Saltos de línea de partido - o ?


Mientras escribía esta respuesta, tuve que coincidir exclusivamente en saltos de línea en lugar de usar la bandera s (dotall-dot coincide con saltos de línea).

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

Me di cuenta

  • Regex101 partidos saltos de línea solo en \n
    (ejemplo - delete \r y coincide)

  • RegExr partidos saltos de línea ni en \n nor on \r\n
    y no puedo encontrar algo para que coincida con un salto de línea, excepto por la m-bandera y \s
    (ejemplo)

  • Debuggex se comporta aún más diferente:
    en este ejemplo solo coincide con \r\n, mientras que
    aquí solo coincide con \n, con las mismas banderas y motor especificado

Soy plenamente consciente de la bandera m-(multilínea-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 pestañas y espacios, también.

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

  1. ¿Existe una forma segura de integrar la coincidencia en un salto de línea (preferiblemente independientemente del lenguaje utilizado) en una expresión regular?
  2. ¿Por qué los sitios mencionados anteriormente se comportan de manera diferente (especialmente Debuggex, coincidiendo una sola vez en \n y solo una vez en \r\n)?
Author: Community, 2013-11-18

5 answers

Va a responder en dirección opuesta;)

2) Para una explicación completa sobre \r y \n tengo que referirme a esta pregunta, que es mucho más completa de lo que publicaré aquí: ¿Diferencia entre \n y \r?

En resumen, Linux usa \n para una nueva línea, Windows \r\n y Macs antiguos \r. Así que hay varias formas de escribir una nueva línea. Su segunda herramienta (RegExr), por ejemplo, coincide con el único \r.

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

 108
Author: Peter van der Wal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:12

Tiene diferentes terminaciones de línea en los textos de ejemplo en Debuggex. Lo que es especialmente interesante es que Debuggex parece haber identificado qué estilo de terminación de línea usó primero, y convierte todas las terminaciones de línea adicionales ingresadas a ese estilo.

Utilicé Notepad++ para pegar texto de muestra en formato Unix y Windows en Debuggex, y lo que pegué 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 pegar en Debuggex. Asegúrate de pegar el estilo que deseas. El valor predeterminado de Debuggex es Unix style (\n).

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

(\r?\n) cubrirá Unix y Windows. Necesitarás algo más complejo, como (\r\n|\r|\n), si quieres que coincida con Mac viejo también.

 6
Author: Dane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-18 20:53:54

Esto solo se aplica a la pregunta 1.

Tengo una aplicación que se ejecuta en Windows y utiliza un cuadro de edición MFC de varias líneas.
El cuadro del editor espera saltos de línea CRLF, pero necesito analizar el texto ingresado
con algunas regexs realmente grandes / desagradables.

No quería estar estresado sobre esto mientras escribía la expresión regular, así que
Terminé normalizando de ida y vuelta entre el analizador y el editor para que
las expresiones regulares solo usan \n. También atrapo operaciones de pegado y las convierto para el cuadro.

Esto no toma mucho tiempo.
Esto es lo que 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" );
 }
 1
Author: sln,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-18 21:41:54

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()
 0
Author: Keelung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 12:21:46

En el bloc de notas++ \R coincide con \n y \r\n.

 -1
Author: Cwazy Paving,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 08:21:06