2010-07-10 7 views
22

Estoy seguro de que esto se ha preguntado antes, pero no puedo encontrarlo.¿Qué es una expresión regular multiplataforma para la eliminación de saltos de línea?

Básicamente, suponiendo que está analizando un archivo de texto de origen desconocido y desea reemplazar los saltos de línea con algún otro delimitador, ¿es esta la mejor expresión regular, o hay otra?

(\r\n)|(\n)|(\r)

+1

le gustan-viejo estilo Mac saltos de línea ('\ R'), o únicamente sobre Unix y Windows ('\ n' y '\ r \ n')? –

+1

posible duplicado de [Expresión regular para que coincida con los caracteres de nueva línea de plataforma cruzada] (http://stackoverflow.com/questions/1331815/regular-expression-to-match-cross-platform-newline-characters) – Amarghosh

Respuesta

0

Basta con sustituir /[\r\n]+/g con una cadena vacía "".

Reemplazará todos \r y \n sin importar el orden en que aparezcan en la cadena.

+0

Esto reemplazará cualquier número de saltos de línea con un token de reemplazo. –

+0

@Andreas Él quiere eliminar los saltos de línea. – Amarghosh

+1

Bueno, él quiere reemplazarlos con otro delimitador ... –

20

hacer Compruebe si su motor de expresiones regulares apoya \R como una clase de caracteres taquigrafía y usted no tendrá que preocuparse por los diferentes combos de nueva línea/avance de línea Unicode. Si se implementa correctamente, puede hacer coincidir todas las terminaciones de líneas ASCII o Unicode de forma transparente con \R.

En Unicode necesita detectar NEL (línea de OS/390 que termina, \ x85) LS (Línea de separación, \ x2028) y PS (Párrafo separador, \ x2029) si usted quiere ser plataforma completamente cruz en estos días.

Es discutible si LS, NEL y PS deben tratarse como saltos de línea, finales de línea o espacios en blanco. El estándar XML 1.0, por ejemplo, does not recognize NEL como carácter de salto de línea. ECMAScript trata LS y PS como saltos de línea pero NEL como espacios en blanco. Perl unicode regexs tratarán VT, FF, CR, CRLF, NEL, LS y PS como saltos de línea con el fin de ^ y $ meta caracteres de expresiones regulares.

El Unicode Implementation Guide (sección 5.8 y tabla 5.3) es probablemente la mejor apuesta de lo que es el tratamiento definitivo de lo que es una "nueva línea".

Si sólo está preocupado por ASCII con las variantes clásicas de DOS/Windows/Unix/Mac, la expresión regular equivalente a \R es (?>\r\n|[\r\n])

En Unicode, el equivalente a \R es (?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029) El \x0b en que hay una línea vertical lengüeta; una vez más, esto puede o no ajustarse a la definición de lo que es un salto de línea, pero eso coincide con la recomendación de la implantación Unicode. (FF, o \x0C no está incluido en la expresión regular, ya que una alimentación de página es una página nueva, no una nueva línea en la definición.)

+0

"utf8" en su respuesta debe ser "Unicode". UTF-8 es simplemente una de las codificaciones de caracteres Unicode. –

+0

¡Tiene razón, pero los documentos a los que me refería (el manual de PCRE) tenían el mismo problema! Editar hecho ... – dawg

+2

En Java, la parte '\ x2028 | \ x2029' debe escribirse' \ u2028 | \ u2029', porque '\ xhh' solo se usa para valores de caracteres hexadecimales de 2 dígitos, mientras que' \ uhhhh' se usa para valores de caracteres hexadecimales de 4 dígitos. –

2

La expresión regular para encontrar cualquier terminación de línea Unicode debe ser (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}]) en lugar de como drewk escribió que, al menos en Perl. Tomado directamente de la documentación perl 5.10.0 (se eliminó en versiones posteriores). Nota las llaves después de \x: U + 2029 es \x{2029} pero \x2029 es un espacio en blanco ASCII (U + 0020) + un dígito 2 + a dígitos 9. \n fuera de una clase de caracteres, tampoco está garantizado para que coincida con \x{0a}.

1

Si la plataforma no soporta la clase \R según lo sugerido por @dawg anteriormente, todavía puede ser capaz de hacer una solución muy elegante y robusta si la plataforma soporta negativo lookaround o clase de caracteres resta (por ejemplo, en Java resta clase es a través del syntax[x&&[^y]]).

En la mayoría de las gramáticas de expresión regulares, el carácter de punto se define como "cualquier carácter excepto el carácter de nueva línea" (consulte, por ejemplo, JavaScript, here). Si coincide con algo con las siguientes características:

  1. no (cualquier carácter excepto el carácter de nueva línea) → carácter de nueva línea; y
  2. es un espacio en blanco

Desde que estoy trabajando actualmente en JavaScript, que yo sepa no tiene el carácter de clase de sustracción \R taquigrafía o , todavía puedo utilizar búsqueda negativa hacia delante para conseguir lo que quiero. La siguiente expresión regular detecta cada nueva línea:

/((?!.)\s)+/g 

Y el siguiente código JavaScript, por lo menos cuando se ejecutan en Chrome 42.0.2311.90m en Windows 7, se limpia a cabo todos los tipos de saltos de línea que JavaScript (es decir, el "ECMAScript" mencionado en el párrafo tercero de dawg @) reconoce:

var input = "hello\r\n\f\v\u2028\u2029 world"; 
 
var output = input.replace(/((?!.)\s)+/g, ""); 
 
document.write(output); // hello world

Cuestiones relacionadas