Analisi delle stringhe, estrazione di numeri e lettere

Qual è il modo più semplice per analizzare una stringa ed estrarre un numero e una lettera? Ho una stringa che può essere nel seguente formato (numero | lettera o lettera | numero), cioè “10A”, “B5”, “C10”, “1G”, ecc.

Ho bisogno di estrarre le 2 parti, cioè “10A” -> “10” e “A”.

Aggiornamento: grazie a tutti per tutte le risposte eccellenti

Il modo più semplice è probabilmente usare espressioni regolari.

((?\d+)(?[a-zA-Z])|(?[a-zA-Z])(?\d+)) 

È quindi ansible abbinarlo alla stringa ed estrarre il valore dai gruppi.

 Match match = regex.Match("10A"); string letter = match.Groups["letter"].Value; int number = int.Parse(match.Groups["number"].Value); 

Il modo più semplice e veloce è usare semplici operazioni con le stringhe. Utilizzare il metodo IsDigit per verificare dove si trova la lettera e analizzare il resto della stringa su un numero:

 char letter = str[0]; int index = 1; if (Char.IsDigit(letter)) { letter = str[str.Length - 1]; index = 0; } int number = int.Parse(str.Substring(index, str.Length - 1)); 
 char letter = str.Single(c => char.IsLetter(c)); int num = int.Parse(new string(str.Where(c => char.IsDigit(c)).ToArray())); 

Questa soluzione non è terribilmente severa (consentirebbe cose come “5A2” e restituire ‘A’ e 52) ma potrebbe andare bene per i tuoi scopi.

Solo per essere diversi:

 string number = input.Trim("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()); string letter = input.Trim("0123456789".ToCharArray()); 

Ecco come mi avvicinerei a questo. Puoi passarci sopra e mettere gc1 [“lettera”], gc1 [“numero”], gc2 [“lettera”] e gc2 [“numero”] nella finestra di controllo per vedere che ha funzionato (passo appena passato l’ultimo linea di codice qui, ovviamente).

L’epossressione regolare prenderà entrambi i pattern richiedendo una o più lettere e numeri in ciascun caso.

  Regex pattern = new Regex("^(?[a-zA-Z]+)(?[0-9]+)|(?[0-9]+)(?[a-zA-Z]+)$"); string s1 = "12A"; string s2 = "B45"; Match m1 = pattern.Match(s1); Match m2 = pattern.Match(s2); GroupCollection gc1 = m1.Groups; GroupCollection gc2 = m2.Groups; 

Usando Sprache e alcuni Linq kung-fu:

 var tagParser = from a in Parse.Number.Or(Parse.Letter.Once().Text()) from b in Parse.Letter.Once().Text().Or(Parse.Number) select char.IsDigit(a[0]) ? new{Number=a, Letter=b} : new{Number=b, Letter=a}; var tag1 = tagParser.Parse("10A"); var tag2 = tagParser.Parse("A10"); tag1.Letter; // should be A tag1.Number; // should be 10 tag2.Letter; // should be A tag2.Number; // should be 10 /* Output: A 10 A 10 */