Controlla se una stringa corrisponde a una regex in JS


752

Voglio usare JavaScript (può essere con jQuery) per fare una convalida sul lato client per verificare se una stringa corrisponde alla regex:

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

Idealmente sarebbe un'espressione che restituiva vero o falso.

Sono un novizio di JavaScript, fa match()quello che mi serve? Sembra verificare se parte di una stringa corrisponde a una regex, non al tutto.


Vuoi una corrispondenza completa o semplicemente se la stringa contiene una sottostringa corrispondente?
Kerrek SB,

1
Una corrispondenza completa, non una sottostringa corrispondente.
Richard,

Risposte:


1196

Usa regex.test()se tutto ciò che vuoi è un risultato 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 potresti rimuoverlo ()dal tuo regexp poiché non hai bisogno di catturare.


1
Cosa ci fa qui l'iniziale ^ nella regex?
PedroD,

8
@PedroD ^ implica l'inizio o inizia con
Nagaraju il

Quindi come faresti il ​​contrario? "non inizia con ..."
PedroD


3
@stackdave stai forse lavorando con Java, piuttosto che con JavaScript?
sfarbota

176

Utilizzare il test()metodo:

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

3
Si noti che la versione con RegExpconsente di iniettare valori variabili nella stringa regex.
Christophe Roussy,

2
new RegExp("^([a-z0-9]{5,})$")ho dovuto rimuovere le doppie virgolette per farlo funzionare
Facundo Colombier,

98

Puoi anche usare match():

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

Ma test()sembra essere più veloce come puoi leggere qui .

Differenza importante tra match()e test():

match()funziona solo con stringhe, ma test()funziona anche con numeri interi.

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

Il motivo per cui funziona con un numero è perché il numero è forzato in una stringa, perché viene fornito come parametro quando si aspetta una stringa. Non farei affidamento su questo comportamento. Dipende dall'implementazione di test () nel tuo ambiente. (la corrispondenza fallisce perché i numeri non hanno un matchmembro). Consiglio di convertire esplicitamente il numero in una stringa se si desidera utilizzarlo con una regex ( String(123)ad esempio).
Bronzdragon,

La corrispondenza può essere utilizzata qui, ma se si guarda alle prestazioni, si testottiene un rendimento del 30% migliore quando si desidera solo convalidare una stringa per abbinare la regex e non estrarre sottostringhe da essa.
Akansh,

@pmrotule Sì, ma dovrebbe essere menzionato prima della descrizione della partita.
Akansh,

La differenza più significativa tra test e match (e matchAll) è che match fa cose come restituire un elenco di tutte le sottostringhe corrispondenti, mentre test controlla solo se ce ne sono. Controlla i metodi regex in javascript.info/regexp-methods
Juan Lanus

50

Utilizzare /youregexp/.test(yourString)se si desidera solo sapere se la stringa corrisponde a regexp.


8

Ecco un esempio che cerca determinati tag HTML, quindi è chiaro che /someregex/.test()restituisce un valore 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

Puoi provare questo, funziona per me.

 <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

per favore prova questo fiore:

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

vero


1

provare

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


2
Quale nuovo valore porta questa risposta di solo codice alla pagina?
Mickmackusa,

attualmente è la soluzione più breve (a causa della semplificazione regexp)
Kamil Kiełczewski

1
Rasatura di 1 carattere dagli schemi pubblicati anni fa. Sbadiglio.
Mickmackusa,

2
Basta lasciare un commento sotto una risposta precedente per affermare che è 0-9possibile ridurre aaaaaaaaaaaaaaaaaaa fino in fondo \d. Oh, e che un gruppo di cattura non è necessario.
Mickmackusa,

1

Consiglierei di usare il metodo execute che restituisce null se non esiste alcuna corrispondenza, altrimenti restituisce un oggetto utile.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.