2011-12-29 19 views
12

Estoy tratando de hacer algo que pensé que sería muy fácil de hacer, que es restringir una cadena a ciertos caracteres al hacer coincidir una expresión regular..match() con una expresión regular devuelve nulo

var value = 'FailureStr1ng'; 
var type = 'ALPHA'; 
var regex = null; 

switch(type) { 
    case 'ALPHA': 
     regex = '^[a-zA-Z]+$'; 
     break; 
    case 'NUMERIC': 
     regex = '^[0-9]+$'; 
     break; 
    case 'ALPHANUMERIC': 
     regex = '^[a-zA-Z0-9]+$'; 
     break; 
} 

return value.match(regex); 

Por alguna razón, cuando se utiliza el partido siempre devuelve null. ¿Hay alguna manera de arreglar esto o un método mejor para hacer esto?

Nota: El código aquí es un fragmento de código mucho más grande y, a su vez, el valor y la variable de tipo suelen definirse por otro método.

+2

Devuelve nulo porque tiene un '1' en la cadena por lo que no coincide. Cambiarlo a una cadena válida devuelve esa cadena. http://jsfiddle.net/GLVAj/ –

Respuesta

27

Quiere RegExp.test, que prueba el valor de una coincidencia en lugar de recuperar la coincidencia. Con su código existente, eso significaría:

if(!new RegExp(regex).test(value)){ 
    alert('Your string was invalid.'); 
} 

Sin embargo, sería preferible usar literales RegExp en lugar de cadenas, ya que son mucho más eficiente y clara, y menos propenso al error:

var value = 'FailureStr1ng'; 
var type = 'ALPHA'; 
var regex = null; 

switch(type) { 
    case 'ALPHA': 
     regex = /^[a-zA-Z]+$/; 
     break; 
    case 'NUMERIC': 
     regex = /^[0-9]+$/; 
     break; 
    case 'ALPHANUMERIC': 
     regex = /^[a-zA-Z0-9]+$/; 
     break; 
} 

if(!regex.test(value)) { 
    alert('Your string was invalid.'); 
} 

Aún mejor, usar un diccionario:

var expressions = { 
    ALPHA: /^[a-zA-Z]+$/, 
    NUMERIC: /^[0-9]+$/, 
    ALPHANUMERIC: /^[a-zA-Z0-9]+$/ 
}; 

if(!expressions[type].test(value)) { 
    alert('Your string was invalid.'); 
} 
+3

¡Gracias! Funcionando perfectamente Votaré la respuesta correcta tan pronto como stackoverflow me lo permita. – MichaelH

+0

Estaba poniendo el patrón de expresiones regulares entre comillas simples y ese era mi problema ...: D) –

7

expresión regular debe estar rodeado con /, no ', de manera que JavaScript crea una variable de tipo Rege x, no de tipo cadena. Así, por ejemplo, para su caso ALPHA, usted debe tener

regex = /^[a-zA-Z]+$/; 

Ver MDN's page on .match para obtener más información sobre el uso .match.

+0

Gracias, voy a probarlo. – MichaelH

1

Tu código se ve como si estuviera dentro de function { ... }. ¿Estás return ing algo? Si no, es por eso que está obteniendo null de nuevo ...

Además, las expresiones regulares están rodeadas por barras (/.../), sin comillas.

+0

He arreglado el código ahora, quise decir que value.match (regex) devolvía nulo. No es la función. – MichaelH

+0

El valor devuelto por una función que no devuelve nada es 'undefined', no' null'. –

Cuestiones relacionadas