Une option serait de commencer à partir de votre index connu et de lire les caractères jusqu'à ce que vous atteigniez une valeur non numérique. Ce n'est pas la solution la plus robuste, mais cela fonctionnera si vous savez que vos entrées vont toujours ressembler à ceci (c'est-à-dire, pas de point décimal ou d'autres caractères non numériques dans la partie numérique de la chaîne).
Quelque chose comme ceci:
public static int GetNumberAtIndex(this string text, int index)
{
if (index < 0 || index >= text.Length)
throw new ArgumentOutOfRangeException("index");
var sb = new StringBuilder();
for (int i = index; i < text.Length; ++i)
{
char c = text[i];
if (!char.IsDigit(c))
break;
sb.Append(c);
}
if (sb.Length > 0)
return int.Parse(sb.ToString());
else
throw new ArgumentException("Unable to read number at the specified index.");
}
Utilisation dans votre cas ressemblerait à ceci:
string some_string = @"A simple demo of SMS text messaging.\r\n+CMGW: 3216\r\n...";
int index = some_string.IndexOf("CMGW") + 6;
int value = some_string.GetNumberAtIndex(index);
Console.WriteLine(value);
Sortie:
3216
Sérieusement, personne n'a encore suggéré de regex? – mpen
@Mark Je suis d'accord - expressions régulières pour les langages réguliers –
Cela ne semble pas être un bon ajustement ici, mais FWIW est une autre façon d'aborder ce problème: une expression régulière, comme CMGW: (\ S +) puis des groupes [1] .value –