我有一个变量,它有很多我需要排序的内容。 但是使用IndexOf和Substring,只是给我一个不那么明显的错误。
ArgumentOutOfRangeException:参数超出范围。
参数名称:startIndex
错误发生在“string lookThroughString = ..”行。
我的代码只是试图查看字符串,找到正确的内容,然后吐出来。
private string SCRIPT_CONTENT;
public string GetVariable(string variable_name) {
int length = 0;
string lookThroughString = SCRIPT_CONTENT.Substring(SCRIPT_CONTENT.IndexOf(variable_name));
foreach(char c in lookThroughString) {
if(c.ToString() != ";") {
length++;
}
}
return SCRIPT_CONTENT.Substring(SCRIPT_CONTENT.IndexOf(variable_name + "::"), length);
}
我正在浏览的“脚本”/“内容”是:
spellName::Fireball;
spellID::1;
我想要这个函数,从输入的变量名的开头(在本例中为'SpellName')基本返回,直到第一个分号。
答案 0 :(得分:5)
问题是,您的variable_name
变量值为"SpellName"
,但字符串中的值实际为"spellName"
(小写s
)。由于实际上不能在字符串中找到该变量名称,.IndexOf(variable_name)
返回-1,而.Substring
不能将负索引作为参数。
快速解决方案是在使用之前简单地检查IndexOf
的结果:
int index = SCRIPT_CONTENT.IndexOf(variable_name);
if (index < 0) {
return string.Empty; // or throw an exception
}
string lookThroughString = SCRIPT_CONTENT.Substring(index);
但我们可以将此方法简化为:
public string GetVariable(string variable_name) {
int startIndex = SCRIPT_CONTENT.IndexOf(variable_name);
if (startIndex < 0) {
return string.Empty; // or throw an exception
}
startIndex += variable_name.Length + 2;
int endIndex = SCRIPT_CONTENT.IndexOf(";", startIndex);
return SCRIPT_CONTENT.Substring(startIndex, endIndex - startIndex);
}
或者,如果您愿意使用regular expressions,则可以进一步简化:
public string GetVariable(string variable_name) {
var pattern = string.Format("{0}::(.*?);", Regex.Escape(variable_name));
return Regex.Match(SCRIPT_CONTENT, pattern).Groups[1].ToString();
}