Perché String.match (/ \ d * /) restituisce una stringa vuota?

Qualcuno può aiutarmi a capire perché usare \ d * restituisce un array contenente una stringa vuota, mentre usando \ d + restituisce [“100”] (come previsto). Capisco perché \ d + funziona, ma non vedo perché esattamente \ d * non funzioni. Usa * perché restituisca una corrispondenza di lunghezza zero e come funziona esattamente?

var str = 'one to 100'; var regex = /\d*/; console.log(str.match(regex)); // [""] 

Ricorda che la match sta cercando la prima sottostringa che può trovare che corrisponde alla regex fornita.

* significa che potrebbero esserci zero o più di qualcosa, quindi \d* significa che stai cercando una stringa che contiene zero o più cifre.

Se la stringa di input iniziava con un numero, quell’intero numero sarebbe stato abbinato.

 "5 to 100".match(/\d*/); // "5" "5 to 100".match(/\d+/); // "5" 

Ma dal momento che il primo carattere è una cifra non-digit, match() , l’inizio della stringa (senza caratteri) corrisponde alla regex.

Dato che la tua stringa non inizia con nessuna cifra, una stringa vuota è la prima sottostringa del tuo input che corrisponde a quella regex.

/\d*/

significa ” combacia con 0 o più numeri a partire dall’inizio della stringa “.

Quando si inizia l’inizio per la stringa, si colpisce immediatamente un numero diverso e non si può andare oltre. Tuttavia, questa è considerata una corrispondenza di successo perché “0 o più”.

Puoi provare “1 o più” tramite

 /\d+/ 

oppure puoi dire che corrisponde a “0 o più” dalla fine della stringa:

 /\d*$/ 

Trova tutto in Python

In Python, c’è il metodo findall() che restituisce tutte le parti della stringa con le quali l’espressione regolare è stata confrontata.

 re.findall(r'\d*', 'one to 100') # => ['', '', '', '', '', '', '', '100', ''] 

.match() in JavaScript, restituisce solo la prima corrispondenza, che sarebbe il primo elemento dell’array precedente.

* significa 0 o più, quindi corrisponde a 0 volte. Devi usare + per 1 o più. Di default è avido, quindi corrisponderà a 100 :

 var str = 'one to 100'; var regex = /\d+/; console.log(str.match(regex)); // ["100"] 

Come dice @StriplingWarrior di seguito, la stringa vuota è la prima corrispondenza, quindi viene restituita. Vorrei aggiungere che si può dire che cosa sta facendo l’espressione regolare notando il campo ‘indice’ che restituisce la funzione match . Ad esempio, questo è ciò che ottengo quando eseguo il tuo codice in Chrome:

 ["", index: 0, input: "one to 100"]