我有一个这样的字符串:
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
谢谢你!答案 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();