Espressione regolare per contare il numero di virgole in una stringa

Come posso creare un’espressione regolare che corrisponda a una stringa di qualsiasi lunghezza contenente caratteri ma che deve contenere 21 virgole?

/^([^,]*,){21}[^,]*$/ 

Questo è:

 ^ Start of string ( Start of group [^,]* Any character except comma, zero or more times , A comma ){21} End and repeat the group 21 times [^,]* Any character except comma, zero or more times again $ End of string 

Se stai usando una varietà regex che supporta il quantificatore Possessive (es. Java), puoi fare:

 ^(?:[^,]*+,){21}[^,]*+$ 

Il quantificatore Possessivo può essere una prestazione migliore di un quantificatore Greedy.

Spiegazione:

 (?x) # enables comments, so this whole block can be used in a regex. ^ # start of string (?: # start non-capturing group [^,]*+ # as many non-commas as possible, but none required , # a comma ) # end non-capturing group {21} # 21 of previous entity (ie the group) [^,]*+ # as many non-commas as possible, but none required $ # end of string 

Potrebbe essere più veloce e più comprensibile per scorrere la stringa, contare il numero di virgole trovate e confrontarle con 21.

Esattamente 21 virgole:

 ^([^,]*,){21}[^,]$ 

Almeno 21 virgole:

 ^([^,]?,){21}.*$ 
 ^(?:[^,]*)(?:,[^,]*){21}$ 

se esattamente 21:

 /^[^,]*(,[^,]*){21}$/ 

se almeno 21:

 /(,[^,]*){21}/ 

Tuttavia, suggerirei di non usare regex per un compito così semplice. Perché è lento.

Quale lingua? C’è probabilmente un metodo più semplice.

Per esempio…

In CFML, puoi vedere se ListLen(MyString) è 22

In Java, puoi confrontare MyString.split(',') a 22

eccetera…

 var valid = ((" " + input + " ").split(",").length == 22); 

o…

 var valid = 21 == (function(input){ var ret = 0; for (var i=0; i 

Si esibirà meglio di ...

 var valid = (/^([^,]*,){21}[^,]*$/).test(input); 
 .*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,