我正在尝试从字符串的最后一部分中提取数字,我已经编写了一个函数来执行此操作,但是我遇到了超出范围索引的问题。
这是字符串
type="value" cat=".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.1" descCat=".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.3"
这是我的功能
private static string ExtractDescOID(string property)
{
string result = "";
int startPos = property.LastIndexOf("descOid=\"") + "descOid=\"".Length;
int endPos = property.Length - 1;
if (endPos - startPos != 1)
{
//This now gets rid of the first . within the string.
startPos++;
result = property.Substring(startPos, endPos);
}
else
{
result = "";
}
if (startPos == endPos)
{
Console.WriteLine("Something has gone wrong");
}
return result;
}
我希望能够获得1.3.6.1.4.1.26928.1.1.1.2.1.2.1.3
字符串的这一部分。我已逐步完成代码,字符串长度为99,但是当AND MY startPos变为64且endPos变为98时,实际上在该范围内。
答案 0 :(得分:4)
答案 1 :(得分:4)
Substring(int, int)
的第二个参数不是“结束位置”,而是要返回的子字符串的长度。
result = property.Substring(startPos, endPos - startPos);
答案 2 :(得分:1)
解决此问题的另一种方法可能是使用string.Split()
来处理解析。我建议这个的唯一原因(除了我想提供已经存在的其他选项,加上这是懒人的方法)是从代码的角度来看,代码更容易恕我直言,分解,并在分解时,更容易被别人理解。
以下是示例程序,其中包含一些注释以说明我的观点(已测试,顺便说一句)。
class Program
{
static void Main(string[] args)
{
var someAttributesFromAnXmlNodeIGuess =
"type=\"value\" cat=\".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.1\" descCat=\".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.3\"";
var descCat = GetMeTheAttrib(someAttributesFromAnXmlNodeIGuess, "descCat");
Console.WriteLine(descCat);
Console.ReadLine();
}
// making the slightly huge assumption that you may want to
// access other attribs in the string...
private static string GetMeTheAttrib(string attribLine, string attribName)
{
var parsedDictionary = ParseAttributes(attribLine);
if (parsedDictionary.ContainsKey(attribName))
{
return parsedDictionary[attribName];
}
return string.Empty;
}
// keeping the contracts simple -
// i could have used IDictionary, which might make sense
// if this code became LINQ'd one day
private static Dictionary<string, string> ParseAttributes(string attribLine)
{
var dictionaryToReturn = new Dictionary<string, string>();
var listOfPairs = attribLine.Split(' '); // items look like type=value, etc
foreach (var pair in listOfPairs)
{
var attribList = pair.Split('=');
// we were expecting a type=value pattern... if this doesn't match then let's ignore it
if (attribList.Count() != 2) continue;
dictionaryToReturn.Add(attribList[0], attribList[1]);
}
return dictionaryToReturn;
}
}