Verifique se uma sequência corresponde a um regex em JS


752

Eu quero usar JavaScript (pode ser com jQuery) para fazer alguma validação no lado do cliente para verificar se uma string corresponde ao regex:

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

Idealmente, seria uma expressão que retornasse verdadeira ou falsa.

Sou iniciante em JavaScript, faz match()o que preciso? Parece verificar se parte de uma string corresponde a um regex, não a coisa toda.


Deseja uma correspondência completa ou apenas se a sequência contém uma substring correspondente?
Kerrek SB

1
Uma correspondência completa - não uma substring correspondente.
Richard

Respostas:


1196

Use regex.test()se tudo que você deseja é um 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

... e você pode remover o ()do seu regexp, pois você não precisa capturar.


1
O que o ^ inicial no regex faz lá?
PedroD 01/12/19

8
@PedroD ^ implica começando ou começa com
Nagaraju

Então, como você faria o oposto? "não começa com ..."
PedroD 07/12/16


3
@stackdave, talvez você esteja trabalhando com Java, em vez de JavaScript?
sfarbota

176

Use o test()método:

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}

3
Observe que a versão com RegExppermite injetar valores variáveis ​​na cadeia de caracteres regex.
Christophe Roussy 04/04

2
teve que remover aspas duplas em new RegExp("^([a-z0-9]{5,})$"), a fim de fazê-lo funcionar
Facundo Colombier

98

Você também pode usar match():

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

Mas test()parece ser mais rápido, como você pode ler aqui .

Diferença importante entre match()e test():

match()funciona apenas com strings, mas test()também com inteiros.

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

A razão pela qual ele trabalha com um número é porque o número é coagido em uma sequência, porque é fornecido como parâmetro quando se espera uma sequência. Eu não confiaria nesse comportamento. Depende da implementação de test () do seu ambiente. (a correspondência falha porque os números não têm um matchmembro). Eu recomendo explicitamente converter seu número em uma string se você quiser usá-lo com uma regex ( String(123)por exemplo).
Bronzdragon

A correspondência pode ser usada aqui, mas se você observar o desempenho, terá um desempenho test30% melhor quando queremos apenas validar uma string para corresponder ao regex e não extrair substrings dele.
Akansh

@pmrotule Sim, mas deve ser mencionado antes da descrição da partida.
Akansh

A diferença mais significativa entre test e match (e matchAll) é que match faz coisas como retornar uma lista de todas as sub-strings correspondentes, enquanto test apenas verifica se há alguma. Verifique os métodos regex em javascript.info/regexp-methods
Juan Lanus

50

Use /youregexp/.test(yourString)se você deseja apenas saber se sua sequência corresponde ao regexp.


8

Aqui está um exemplo que procura determinadas tags HTML, para que fique claro que /someregex/.test()retorna um booleano:

if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');

6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));

2

Você pode tentar isso, funciona para mim.

 <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>

1

por favor tente esta flor:

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

verdade


1

tentar

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


2
Que novo valor essa resposta somente de código traz para a página?
mickmackusa

Actualmente é mais curto solução (devido à simplificação expreg)
Kamil Kiełczewski

1
Raspar 1 caractere dos padrões publicados anos atrás. Bocejar.
Mckmackusa

2
Basta deixar um comentário em uma resposta anterior para declarar que 0-9pode ser reduzido a todo o caminho até \d. Ah, e que um grupo de captura não é necessário.
mickmackusa

1

Eu recomendaria usar o método execute, que retornará nulo se não houver correspondência, caso contrário, ele retornará um 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]

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.