2011-10-31 12 views
15

pregunta rápida: mi patrón es una cadena svg y se ve como l 5 0 l 0 10 l -5 0 l 0 -10 Para hacer una comparación unittest contra una referencia que necesito para deshacerme de todos excepto el primero l Sé que puede deshacerse de todos y poner una 'l' por adelantado, o puedo usar subcadenas. Pero me pregunto si hay una expresión javascript para expresiones regulares para esto.Cómo reemplazar todo PERO la primera aparición de un patrón en la cadena

+0

¿La primera siempre está al comienzo de la cadena? –

+0

Sé que dijiste que no quieres esto, pero subscribir hasta el primer espacio parece ser el más fácil de leer y mantener. – Randy

+0

@ Marque sí para este uso, es incluso 'l', pero eso también funciona con un aspecto negativo. –

Respuesta

24

puede probar con una búsqueda negativa hacia delante, evitando el inicio de la cadena:

/(?!^)l/g 

Ver si en línea: jsfiddle

+0

Sí, esto parece funcionar gracias! –

+0

Estoy tratando de modificar esto para que funcione para el primer carácter '-' que aparece, y estoy teniendo un momento muy difícil :(. Cualquier ayuda es apreciada. Gracias de antemano. –

+0

¿Cómo usaría esto con una variable? – Wlliam

-1

Algo como esto?

"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/[^^]l/g, '')

+3

Aunque esto sí funciona en este caso, ¿'^' no representa el carácter literal en una clase de caracteres? – pimvdb

+2

'[^^]' coincide con cualquier carácter además de ''^''. No coincide con cero- caracteres en cualquier punto que no sea el inicio de la entrada como lo requiere. '(!/[^^] /. test ('^') && /[^^]/.test('x ')) === true' –

7

No hay JS RegExp a reemplazar todo-pero-la-primera-patrón-partido. Sin embargo, puede implementar este comportamiento pasando una función como un segundo argumento al método replace.

var regexp = /(foo bar)(red)/g; //Example 
var string = "somethingfoo bar red foo bar red red pink foo bar red red"; 
var first = true; 

//The arguments of the function are similar to $0 $1 $2 $3 etc 
var fn_replaceBy = function(match, group1, group2){ //group in accordance with RE 
    if (first) { 
     first = false; 
     return match; 
    } 
    // Else, deal with RegExp, for example: 
    return group1 + group2.toUpperCase(); 
} 
string = string.replace(regexp, fn_replaceBy); 
//equals string = "something foo bar red foo bar RED red pink foo bar RED red" 

La función (fn_replaceBy) se ejecuta para cada coincidencia. En la primera coincidencia, la función vuelve inmediatamente con la cadena coincidente (no ocurre nada) y se establece una bandera.
Cada otra coincidencia se reemplazará de acuerdo con la lógica tal como se describe en la función: Normalmente, usa $0 $1 $2, etc., para hacer referencia a grupos. En fn_replaceBy, los argumentos de la función son iguales a estos: Primer argumento = $0, segundo argumento = $1, etcétera.

La subcadena coincidente se reemplazará por el valor de retorno de la función fn_replaceBy. El uso de una función como segundo parámetro para replace permite aplicaciones muy potentes, como intelligent HTML parser.

Consulte también: MDN: String.replace > Specifying a function as a parameter

+0

No estaba convencido de que el "analizador HTML inteligente" no se vincule con la respuesta "analizar HTML mediante la expresión regular", jaja. Pero fue una respuesta muy buena, esto era justo lo que necesitaba :) – henrebotha

2
"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/^\s+/, '').replace(/\s+l/g, '') 

se asegura el primer 'l' no va precedida de espacio y elimina cualquier espacio seguido de un 'l'.

Cuestiones relacionadas