Estoy seguro de que esto se ha preguntado antes, pero yo no lo encuentro.

Básicamente, suponiendo que va a analizar un archivo de texto de origen desconocido y desea reemplazar los saltos de línea con algunos otros delimitador, es esta la mejor expresión regular, o hay otra?

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

5 Comentarios

  1. 20

    Compruebe si su regex motor admite \R como una abreviación de carácter de clase, y usted no tendrá que preocuparse de los diversos Unicode newline /salto de línea combos. Si se aplica correctamente, puede coincidir con todos los diversos ascii o Unicode finales de línea de forma transparente utilizando \R.

    En Unicode usted necesita para detectar NEL (OS/390 de final de línea, \x85) LS (Separador de Línea, \x2028) y PS (Párrafo Separador, \x2029) si quieres ser completamente multiplataforma en estos días.

    Es discutible que la LS, NEL, y PS debe ser tratada como saltos de línea, finales de línea, o un espacio en blanco. El XML 1.0 estándar, por ejemplo, no reconoce NEL como un 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 va a tratar VT, FF, CR, CRLF, NEL, LS y PS como saltos de línea para el propósito de ^ y $ regex meta caracteres.

    La Unicode Guía De Implementación (sección 5.8 y tabla 5.3) es probablemente la mejor apuesta de cuál es el tratamiento definitivo de lo que es un «salto de línea» es.

    Si sólo se preocupan con ascii con los DOS/Windows/Unix/Mac classic variantes, 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) La \x0b hay un tabulador vertical; una vez más, esto puede o no puede adaptarse a usted la definición de lo que es un salto de línea, pero que coincide con la recomendación de que el Unicode de la Implantación. (FF, o \x0C no está incluido en el regex desde una Forma de Alimentación es una página nueva, no una nueva línea en la definición.)

    • «utf8» en su respuesta debe ser «Unicode». UTF-8 es simplemente una de las codificaciones de caracteres Unicode.
    • Tienes razón, pero los médicos me estaba refiriendo a (PCRE manual) tenía el mismo problema! Edición de…
    • En Java, el \x2028|\x2029 parte debe ser por escrito \u2028|\u2029, porque \xhh se utiliza sólo para los 2 dígitos hexadecimal los valores de los caracteres, mientras que \uhhhh se utiliza para el 4 dígitos hexadecimal los valores de los caracteres.
  2. 2

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

  3. 1

    Si la plataforma no admite la \R de clase sugerida por @dawg anteriormente, usted todavía puede ser capaz de hacer un muy elegante y robusta solución si la plataforma admite negativos lookaround o el carácter de clase de la resta (por ejemplo, en la clase Java de la resta es a través de la sintaxis [x&&[^y]]).

    En la mayoría de los regulares expresssion gramáticas, el carácter de punto se define como «cualquier carácter excepto el carácter de nueva línea» (véase, por ejemplo, para JavaScript, aquí). Si coincide en algo con las siguientes características:

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

    Ya que actualmente estoy trabajando en JavaScript, que AFAIK no tiene la \R de taquigrafía o carácter de clase de la resta, todavía puedo utilizar negativo de búsqueda hacia delante para conseguir lo que quiero. La siguiente expresión regular coincide con todos los saltos de línea:

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

    Y el siguiente código de JavaScript, al menos cuando se ejecuta en Chrome 42.0.2311.90 m en Windows 7, se borran todos los tipos de saltos de línea que JavaScript (es decir, el «ECMAScript» que se menciona en @dawg del tercer párrafo) reconoce:

    JS:

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

  4. 0

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

    Va a reemplazar todos los \r y \n no importa en qué orden aparecen en la cadena.

    • Esto reemplazará cualquier número de saltos de línea con una reposición de token.
    • Él quiere quitar saltos de línea.
    • Bien, él quiere reemplazar con otro delimitador…

Dejar respuesta

Please enter your comment!
Please enter your name here