争论超出范围

Kev*_*sen 2 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

我正在浏览的"脚本"/"内容"是:

spellName::Fireball;
spellID::1;
Run Code Online (Sandbox Code Playgroud)

我想要这个函数,从输入的变量名的开头(在本例中为'SpellName')基本返回,直到第一个分号.

p.s*_*w.g 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);
Run Code Online (Sandbox Code Playgroud)

但我们可以简化这种方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意使用正则表达式,则可以进一步简化它:

public string GetVariable(string variable_name) {
    var pattern = string.Format("{0}::(.*?);", Regex.Escape(variable_name));
    return Regex.Match(SCRIPT_CONTENT, pattern).Groups[1].ToString();
}
Run Code Online (Sandbox Code Playgroud)