2010-06-16 154 views
2

我有一个这样的字符串:C#得到另一个字符串中的字符串

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

IM从vb.net快到了,我需要在C#中知道,如果我知道CMGW的位置,如何获得“3216”离开那里?

我知道我的开始应该是CMGW + 6的位置,但是如何在发现“\ r”后立即停止?

再次,我的最终结果应该是3216

谢谢!

+2

说真的,没有人建议正则表达式呢? – mpen 2010-06-16 04:56:41

+0

@Mark我同意 - 正则语言的正则表达式 – 2010-06-16 05:07:13

+0

这听起来不太合适,但FWIW解决这个问题的另一种方法是像CMGW这样的正则表达式:(\ S +),然后groups [1] .value – 2010-06-16 05:51:20

回答

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

该代码将开始在给定的位置,只服用4个字符的some_string的子字符串。

如果你想成为更普遍的,你可以做以下

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; 
相关问题