Javascript regex – divide una cadena

Luchando con una expresión regular requisito. Necesito dividir una cadena en una matriz donde se encuentra una barra diagonal. Pero no se si la barra diagonal es precedido por una vía de escape.

Por ejemplo, si tengo esta cadena:

hello/world

Me gustaría ser dividida en una matriz así:

arrayName[0] = hello
arrayName[1] = world

Y si tengo esta cadena:

hello/wo\/rld

Me gustaría ser dividida en una matriz así:

arrayName[0] = hello
arrayName[1] = wo/rld

Alguna idea?

Esta página es probable que: blog.stevenlevithan.com/archives/mimic-lookbehind-javascript No publicar esto como un respuesta, porque yo no tengo tiempo ahora para venir para arriba con un ejemplo específico de lo que usted necesita. Pero estoy bastante seguro de que usted puede conseguir allí de ese puesto. La buena suerte.

OriginalEl autor WastedSpace | 2011-01-31

7 respuestas

  1. 3

    El siguiente es un poco largo aliento, pero el trabajo, y evita el problema de la Es decir que la fractura de implementación de división por no utilizar una expresión regular.

    function splitPath(str) {
    var rawParts = str.split("/"), parts = [];
    for (var i = 0, len = rawParts.length, part; i < len; ++i) {
    part = "";
    while (rawParts[i].slice(-1) == "\\") {
    part += rawParts[i++].slice(0, -1) + "/";
    }
    parts.push(part + rawParts[i]);
    }
    return parts;
    }
    var str = "hello/world\\/foo/bar";
    alert( splitPath(str).join(",") );
    Saludos! Esto parece la solución que has estado buscando.

    OriginalEl autor Tim Down

  2. 23

    Yo no lo uso split() para este trabajo. Es mucho más fácil para que coincida con la ruta de los componentes de sí mismos, en lugar de los delimitadores. Por ejemplo:

    var subject = 'hello/wo\\/rld';
    var regex = /(?:[^\/\\]+|\\.)+/g;
    var matched = null;
    while (matched = regex.exec(subject)) {
    print(matched[0]);
    }

    de salida:

    hello
    wo\/rld

    prueba en ideone.com

    Esto parece la mejor respuesta para mí.
    De acuerdo. Definitivamente la mejor respuesta.

    OriginalEl autor Alan Moore

  3. 3

    He aquí una forma adaptada de las técnicas en este blog:

    var str = "Testing/one\\/two\\/three";
    var result = str.replace(/(\\)?\//g, function($0, $1){
    return $1 ? '/' : '[****]';
    }).split('[****]');

    Ejemplo en vivo

    :

    Testing/one\/two\/three

    El resultado es:

    [0]: Testing
    [1]: one/two/three

    Que usa primero el sencillo “falso” lookbehind para reemplazar / con [****] y reemplazar \/ con /, luego se divide en la [****] valor. (Obviamente, reemplazar [****] con cualquier cosa que no sea en la cadena.)

    Gracias 🙂 Este es el tipo de cosa que sería adecuado para mí.

    OriginalEl autor T.J. Crowder

  4. 1

    /*
    Si usted está recibiendo su cadena de una respuesta de ajax o de una base de datos de consulta,
    es decir, la cadena no ha sido interpretado por javascript,
    usted puede comparar secuencias de caracteres que no tienen la barra o han escapado de barras.
    Si se define la cadena de caracteres en una secuencia de comandos, escapar de los escapes y tira de ellos después del partido.
    */

    var s='hello/wor\\/ld';
    s=s.match(/(([^\/]*(\\\/)+)([^\/]*)+|([^\/]+))/g) || [s];
    alert(s.join('\n'))
    s.join('\n').replace(/\\/g,'')
    /*  returned value: (String)
    hello
    wor/ld
    */

    OriginalEl autor kennebec

  5. 0

    He aquí un ejemplo en rubular.com

    Que puede ser genial para Ruby, pero no parece que funciona en JavaScript, al menos no con split: jsbin.com/ipote5 Si usted estaba pensando en usarlo de otra manera, me gustaría recomendar la publicación de eso.
    Por favor enviar la solución aquí en lugar de en otro sitio.
    Esto no funciona: "hello/wor\/rld".match(/([a-z]+(\\\/)?[a-z]+)/) => ["hello", "hello", undefined]
    No funciona si se utiliza el g identificador str.match(/[a-z]+(\\\/)?[a-z]+/g);, pero no se si hay más de una \/. (O de cualquier otro carácter al lado de las letras minúsculas para esa materia)
    De ahí la importancia de la publicación de la solución aquí, como usted dijo.

    OriginalEl autor Mikhail

  6. 0

    De código corto, usted puede usar la marcha atrás para simular negativo lookbehind

    function reverse(s){
    return s.split('').reverse().join('');
    }
    var parts = reverse(myString).split(/[/](?!\\(?:\\\\)*(?:[^\\]|$))/g).reverse();
    for (var i = parts.length; --i >= 0;) { parts[i] = reverse(parts[i]); }

    pero para ser eficaz, que es probablemente mejor dividir en /[/]/ y, a continuación, recorrer la matriz y reunirse con los elementos que tienen una vía de escape al final.

    OriginalEl autor Mike Samuel

  7. 0

    Algo como esto puede cuidar de él para usted.

    var str = "/hello/wo\\/rld/";
    var split = str.replace(/^\/|\\?\/|\/$/g, function(match) {
    if (match.indexOf('\\') == -1) {
    return '\x00';
    }
    return match;
    }).split('\x00');       
    alert(split);
    Funciona de la primera \/ pero no funciona en todos los
    Um, claro que sí. jsbin.com/uvuni4/edit

    OriginalEl autor Hemlock

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *