2010-06-16 3 views
2

у меня есть строка, как это:C# получить строку в другую строку

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

им исходя из vb.net, и мне нужно знать, в C#, если я знаю позицию CMGW, как я получаю «3216» оттуда?

Я знаю, что мое начало должно быть позицией CMGW + 6, но как я могу остановить его, как только он найдет «\ r» ??

снова, мой конечный результат должен быть 3216

спасибо!

+2

Серьезно, никто еще не предлагал регулярных выражений? – mpen

+0

@Mark Я согласен - регулярные выражения для регулярных языков –

+0

Это не похоже на хорошую подгонку, но FWIW другой способ решения этого вопроса будет регулярным выражением, например CMGW: (\ S +), а затем группами [1] .value –

ответ

4

Найти индекс \r от начала, где вы заинтересованы, и использовать 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

Если вы знаете позицию 3216, то вы можете просто сделать следующее

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

Этот код будет принимать подстроку some_string, начиная с заданной позиции, и только с 4-х символов.

Если вы хотите быть более общими, вы можете сделать следующий

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

Один из вариантов - начать с вашего известного индекса и читать символы, пока вы не нажмете нечисловое значение. Не самое надежное решение, но оно будет работать, если вы знаете, что ваш вход всегда будет выглядеть так (т. Е. Нет десятичных точек или других нечисловых символов в числовой части строки).

Что-то вроде этого:

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."); 
} 

Использование в вашем случае будет выглядеть следующим образом:

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); 

Выход:

3216 
2

В более общем, если вы не знаете, начало положение CMGW, но структура остается прежней.

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

Если вы хотите, чтобы извлечь номер часть «CMGW: 3216», то более надежный метод будет использовать регулярные выражения. Таким образом, вы можете искать весь шаблон, а не только заголовок.

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; 
Смежные вопросы