我有一個這樣的字符串: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
謝謝!
我有一個這樣的字符串: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
謝謝!
查找\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);
如果你知道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);
一種選擇是從已知的索引開始並讀取字符,直到您輸入非數字值。不是最健壯的解決方案,但是如果您知道您的輸入總是看起來像這樣(即在字符串的數字部分中沒有小數點或其他非數字字符),它將起作用。
事情是這樣的:你的情況
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
更一般的,如果你不知道開始CMGW的位置,但結構仍然像以前一樣。
String s;
char[] separators = {'\r'};
var parts = s.Split(separators);
parts.Where(part => part.Contains("CMGW")).Single().Reverse().TakeWhile(c => c != ' ').Reverse();
如果你想提取'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;
說真的,沒有人建議正則表達式呢? – mpen 2010-06-16 04:56:41
@Mark我同意 - 正則語言的正則表達式 – 2010-06-16 05:07:13
這聽起來不太合適,但FWIW解決這個問題的另一種方法是像CMGW這樣的正則表達式:(\ S +),然後groups [1] .value – 2010-06-16 05:51:20