C#索引和长度必须指向字符串中的位置

时间:2014-05-06 15:19:29

标签: c# string substring

我在使用子串方法时遇到此错误。

我正在尝试执行这个非常简单的代码:

string bla = selected.Substring((selected.IndexOf('(')+1), (selected.Length-1))

选择的值可能是 blabla(bla),我想在括号内得到'bla'...

编辑:我想知道是否有办法在一行上做所有事情,谢谢你的所有答案 edit2:正确答案是

selected.Substring((selected.IndexOf('(') + 1), (selected.Length - selected.IndexOf('(') - 2))
谢谢sinatr,我犯了一个愚蠢的错误

5 个答案:

答案 0 :(得分:2)

不是那么简单。 String.Substring的第二个参数是长度而不是结束索引。您还必须检查索引是否为> = 0并使用带有start-index的重载的String.IndexOf来查找正确的结束索引:

string selected = "blabla(bla)";
string bla = selected;
int index = selected.IndexOf('(');
if(index++ >= 0) // index++ because you want to omit (
{
    int endIndex = selected.IndexOf(')', index); // index is start-index to find )
    if (endIndex >= 0)
    {
        bla = selected.Substring(index, endIndex - index); // endIndex - index -> Length
    }
}

答案 1 :(得分:1)

根据您提出的简单方案,这应该有效:

string bla = selected.Split(new char[] { '(', ')' })[1];

答案 2 :(得分:1)

你也可以用正则表达式做到这一点,虽然它对于那种任务来说是一种重型炮兵;)

string pattern = @"(?<=\()\w+(?=\))";
string input = "BLALBALBLA(BLA)";
string output;
Match match = Regex.Match(input, pattern);
if(match.Success)
{
    output = match.Value;
}

答案 3 :(得分:0)

根据Substring,这个参数是子串的长度,那么你可以编码 确定字符串格式正确,不是空的..

int l_a = selected.IndexOf('(') + 1;
int l_b = selected.IndexOf(')');
string bla = selected.Substring(l_a,l_b-l_a)

答案 4 :(得分:0)

这里用正则表达式解决了你的问题。除最后一个字符外,将匹配第一个(后面的任何内容。

string bla = "blabla(bla)";

Match match = Regex.Match(bla, @"\((.*).");
if (match.Success)
{
    bla = match.Groups[1].Value;
}

如果您确定匹配,则可以将其作为oneliner:

bla = Regex.Match(bla, @"\((.*).").Groups[1].Value;