Compruebe si una cadena coincide con una expresión regular en JS

752

Quiero usar JavaScript (puede ser con jQuery) para hacer una validación del lado del cliente para verificar si una cadena coincide con la expresión regular:

^([a-z0-9]{5,})$

Idealmente, sería una expresión que devuelve verdadero o falso.

Soy un novato en JavaScript, ¿ match()hago lo que necesito? Parece comprobar si parte de una cadena coincide con una expresión regular, no con todo.

Ricardo
fuente
¿Desea una coincidencia completa o simplemente si la cadena contiene una subcadena coincidente?
Kerrek SB
1
Una coincidencia completa, no una subcadena coincidente.
Richard

Respuestas:

1196

Use regex.test()si todo lo que quiere es un resultado booleano:

console.log(/^([a-z0-9]{5,})$/.test('abc1')); // false

console.log(/^([a-z0-9]{5,})$/.test('abc12')); // true

console.log(/^([a-z0-9]{5,})$/.test('abc123')); // true

... y podría eliminar el ()de su expresión regular ya que no necesita una captura.

usuario113716
fuente
1
¿Qué hace el ^ inicial en la expresión regular allí?
PedroD
8
@PedroD ^ implica comenzar o comienza con
Nagaraju
Entonces, ¿cómo harías lo contrario? "no comienza con ..."
PedroD
3
@stackdave ¿tal vez estás trabajando con Java, en lugar de JavaScript?
sfarbota
176

test()Método de uso :

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}
Abhijeet Kasurde
fuente
3
Tenga en cuenta que la versión con RegExppermite inyectar valores variables en la cadena de expresiones regulares.
Christophe Roussy
2
tuvo que eliminar las comillas dobles new RegExp("^([a-z0-9]{5,})$")para que funcione
Facundo Colombier
98

También puedes usar match():

if (str.match(/^([a-z0-9]{5,})$/)) {
    alert("match!");
}

Pero test()parece ser más rápido como puedes leer aquí .

Diferencia importante entre match()y test():

match()funciona solo con cadenas, pero test()también funciona con enteros.

12345.match(/^([a-z0-9]{5,})$/); // ERROR
/^([a-z0-9]{5,})$/.test(12345);  // true
/^([a-z0-9]{5,})$/.test(null);   // false

// Better watch out for undefined values
/^([a-z0-9]{5,})$/.test(undefined); // true
pmrotule
fuente
La razón por la que funciona con un número es porque el número se convierte en una cadena, porque se proporciona como un parámetro cuando espera una cadena. No confiaría en este comportamiento. Depende de la implementación de prueba de su entorno (). (la coincidencia falla porque los números no tienen un matchmiembro). Recomiendo convertir explícitamente su número a una cadena si desea usarlo con una expresión regular ( String(123)por ejemplo).
Bronzdragon
La coincidencia se puede usar aquí, pero si observa el rendimiento, el rendimiento testes un 30% mejor cuando solo queremos validar una cadena para que coincida con la expresión regular y no extraer subcadenas de ella.
Akansh
@pmrotule Sí, pero debería mencionarse antes de la descripción del partido.
Akansh
La diferencia más significativa entre test y match (y matchAll) es que match hace cosas como devolver una lista de todas las subcadenas coincidentes, mientras que la prueba solo verifica si hay alguna. Compruebe los métodos de expresiones regulares en javascript.info/regexp-methods
Juan Lanus
50

Úselo /youregexp/.test(yourString)si solo desea saber si su cadena coincide con la expresión regular.

usuario278064
fuente
8

Aquí hay un ejemplo que busca ciertas etiquetas HTML para que quede claro que /someregex/.test()devuelve un valor booleano:

if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');
usuario2449231
fuente
6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));
Eysun
fuente
2

Puedes probar esto, funciona para mí.

 <input type="text"  onchange="CheckValidAmount(this.value)" name="amount" required>

 <script type="text/javascript">
    function CheckValidAmount(amount) {          
       var a = /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/;
       if(amount.match(a)){
           alert("matches");
       }else{
        alert("does not match"); 
       }
    }
</script>
Tongi
fuente
1

por favor prueba esta flor:

/^[a-z0-9\_\.\-]{2,20}\@[a-z0-9\_\-]{2,20}\.[a-z]{2,9}$/.test('[email protected]');

cierto

Jaber Alshami
fuente
1

tratar

 /^[a-z\d]{5,}$/.test(str)

Kamil Kiełczewski
fuente
2
¿Qué nuevo valor aporta esta respuesta de solo código a la página?
mickmackusa
actualmente es la solución más corta (debido a la simplificación de
expresiones regulares
1
Afeitar 1 personaje de los patrones publicados hace años. Bostezo.
mickmackusa
2
Simplemente deje un comentario debajo de una respuesta anterior para indicar que 0-9se puede reducir aaaaaaaaaaaaaaaaaaaaaaaaaaaaa \d. Ah, y que un grupo de captura no es necesario.
mickmackusa
1

Recomendaría usar el método execute que devuelve nulo si no existe una coincidencia; de lo contrario, devuelve un objeto útil.

let case1 = /^([a-z0-9]{5,})$/.exec("abc1");
console.log(case1); //null

let case2 = /^([a-z0-9]{5,})$/.exec("pass3434");
console.log(case2); // ['pass3434', 'pass3434', index:0, input:'pass3434', groups: undefined]
Juan navarrete
fuente
0
const regExpStr = "^([a-z0-9]{5,})$"
const result = new RegExp(regExpStr, 'g').test("Your string") // here I have used 'g' which means global search
console.log(result) // true if it matched, false if it doesn't
Geetanshu Gulati
fuente