争论超出范围

时间:2014-01-08 01:48:27

标签: c# .net string substring

我有一个变量,它有很多我需要排序的内容。 但是使用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')基本返回,直到第一个分号。

1 个答案:

答案 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();
}