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.

Richard
fonte
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.

user113716
fonte
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");
}
Abhijeet Kasurde
fonte
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
pmrotule
fonte
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.

user278064
fonte
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');
user2449231
fonte
6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));
Eysun
fonte
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>
Tongi
fonte
1

por favor tente esta flor:

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

verdade

Jaber Alshami
fonte
1

tentar

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

Kamil Kiełczewski
fonte
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]
Juan Navarrete
fonte
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
fonte