2010-06-16 4 views
2

j'ai une chaîne comme ceci:C# obtenir une chaîne dans une autre chaîne

some_string = "A simple demo of SMS text messaging.\r\n+CMGW: 3216\r\n\r\nOK\r\n\" 

im venant de vb.net et je dois savoir C#, si je connais la position CMGW, comment puis-je "3216" hors de là?

Je sais que mon départ devrait être la position de CMGW + 6, mais comment puis-je l'arrêter dès qu'il trouve "\ r" ??

encore, mon résultat final devrait être 3216

merci!

+2

Sérieusement, personne n'a encore suggéré de regex? – mpen

+0

@Mark Je suis d'accord - expressions régulières pour les langages réguliers –

+0

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 –

Répondre

4

Trouver l'index de \r depuis le début de l'endroit où suivant qui vous intéresse et utilisez le Substring overload which takes a length:

// Production code: add validation here. 
// (Check for each index being -1, meaning "not found") 
int cmgwIndex = text.IndexOf("CMGW: "); 

// Just a helper variable; makes the code below slightly prettier 
int startIndex = cmgwIndex + 6; 
int crIndex = text.IndexOf("\r", startIndex); 

string middlePart = text.Substring(startIndex, crIndex - startIndex); 
3

Si vous connaissez la position de 3216 alors vous pouvez juste faire le

string inner = some_string.SubString(positionOfCmgw+6,4); 

suivant Ce code prendra la sous-chaîne de some_string à partir de la position donnée et prenant seulement 4 caractères.

Si vous voulez être plus général que vous pourriez faire la

int start = positionOfCmgw+6; 
int endIndex = some_string.IndexOf('\r', start); 
int length = endIndex - start; 
string inner = some_string.SubString(start, length); 
2

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 
2

Plus général, si vous ne connaissez pas le départ position de CMGW mais la structure reste comme avant.

String s; 
    char[] separators = {'\r'}; 
    var parts = s.Split(separators); 
    parts.Where(part => part.Contains("CMGW")).Single().Reverse().TakeWhile(c => c != ' ').Reverse(); 
2

Si vous cherchez à extraire la partie de nombre de « CMGW: 3216 » alors une méthode plus fiable serait d'utiliser des expressions régulières. De cette façon, vous pouvez rechercher le motif entier, et pas seulement l'en-tête.

var some_string = "A simple demo of SMS text messaging.\r\n+CMGW: 3216\r\n\r\nOK\r\n"; 
var match = Regex.Match(some_string, @"CMGW\: (?<number>[0-9]+)", RegexOptions.Multiline); 
var number = match.Groups["number"].Value; 
Questions connexes