Regex Lookahead e guarda al massimo una cifra

Sto cercando di creare un modello RegEx

  • 8 caratteri [a-zA_Z]
  • deve contenere solo una cifra in qualsiasi posizione di stringa

Ho creato questo modello:

 ^(?=.*[0-9].*[0-9])[0-9a-zA-Z]{8}$ 

Questo modello funziona bene ma voglio solo una cifra consentita. Esempio:

 aaaaaaa6 match aaa7aaaa match aaa88aaa don't match aaa884aa don't match aaawwaaa don't match 

Potresti invece usare:

 ^(?=[0-9a-zA-Z]{8})[^\d]*\d[^\d]*$ 

La prima parte affermerebbe che la corrispondenza contiene 8 alfabeti o cifre. Una volta assicurato, la seconda parte assicura che ci sia solo una cifra nella partita.

EDIT: Spiegazione:

  • Le ancore ^ e $ indicano l’inizio e la fine della stringa.
  • (?=[0-9a-zA-Z]{8}) asserisce che la corrispondenza contiene 8 alfabeti o cifre.
  • [^\d]*\d[^\d]* implicherebbe che ci sia un carattere di una sola cifra e caratteri non numerici rimanenti. Poiché avevamo già affermato che l’input contiene cifre o alfabeti, i caratteri non numerici qui sono alfabeti.

Se vuoi una soluzione non regex, l’ho scritta per un piccolo progetto:

 public static bool ContainsOneDigit(string s) { if (String.IsNullOrWhiteSpace(s) || s.Length != 8) return false; int nb = 0; foreach (char c in s) { if (!Char.IsLetterOrDigit(c)) return false; if (c >= '0' && c <= '9') // just thought, I could use Char.IsDigit() here ... nb++; } return nb == 1; }