c#在另一个字符串中获取字符串

时间:2010-06-16 04:37:37

标签: 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

谢谢你!

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 :(得分: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

答案 3 :(得分: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;

答案 4 :(得分:1)

更一般地说,如果你不知道CMGW的起始位置,但结构仍然像以前一样。

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