2011-11-18 12 views
17

Tengo un problema con una parte de una expresión regular que se utilizará en JavaScript. Necesito una forma de unir cualquier carácter que no sea el +, una cadena vacía también debe coincidir.Expresión regular: coincide con cualquier carácter excepto +, cadena vacía también debe coincidir

[^+] es casi lo que quiero, excepto que no coincide con una cadena vacía. He intentado [^+]* pensando: "cualquier personaje que no sea +, cero o más veces", pero esto coincide con todo, incluido +.

+0

¿Cómo es posible que '[^ +] *' coincide con un '+ ¿? Eso no tiene sentido. Debe haber algo más mal con tu expresión. –

+1

@ScottRippey: Adiviné (en mi respuesta) que el cuantificador '*' permitía que la coincidencia tuviera éxito al hacer coincidir nada (cero caracteres que no son '+') con éxito. Sin anclas u otras aserciones, teóricamente podría coincidir antes o después del '+', lo que permite que coincida toda la cadena. (por supuesto, coincidiría antes porque esa es la primera, y se detendría allí) ¿esta evaluación no tiene sentido para usted? –

Respuesta

18

añadir un {0,1} a ella de modo que sólo coincidirá con cero o una vez, ni más ni menos:

[^+]{0,1} 

O, como señaló FailedDev, ? también funciona:

[^+]? 

Como era de esperar, las pruebas con la consola de JavaScript de Chrome muestra no puede competir con "+" pero coincide otros personajes:

x = "+" 
y = "A" 

x.match(/[^+]{0,1}/) 
[""] 

y.match(/[^+]{0,1}/) 
["A"] 

x.match(/[^+]?/) 
[""] 

y.match(/[^+]?/) 
["A"] 
+3

No, no necesita escaparse, en segundo lugar {0,1} =?. +1 Sin embargo. – FailedDev

+0

Ambas opciones parecen coincidir con todo, incluso solo de acuerdo con http://www.regular-expressions.info/javascriptexample.html – zaq

+0

De acuerdo con el sitio anterior, ese no coincide con nada. – zaq

4

Si acaba de probar la cadena para ver si no contiene una +, entonces debería usar:

^[^+]*$ 

Esto coincidirá sólo si la cadena completa no tiene +.

+0

Esto es solo parte de una expresión más grande, por lo que no necesariamente quiero hacer coincidir toda la cadena. – zaq

18
  • [^+] significa "coincide con cualquier carácter que no es un +"
  • [^+]* significa "encontró ningún número de caracteres que no son un +" - que casi parece que lo que yo creo que usted quiere, excepto que coincidirá cero caracteres si el primer carácter (o incluso todos los caracteres) son +.

uso ancla para asegurarse de que la expresión valida la cadena completa:

^[^+]*$ 

significa:

^  # assert at the beginning of the string 
[^+]* # any character that is not '+', zero or more times 
$  # assert at the end of the string 
Cuestiones relacionadas