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

C# C索引和长度必须引用字符串中的位置,c#,string,substring,C#,String,Substring,我在使用substring方法时出现了这个错误 我试图执行以下非常简单的代码: string bla = selected.Substring((selected.IndexOf('(')+1), (selected.Length-1)) 选择的值可以是blabla,我只想得到括号内的'bla' 编辑:我想知道是否有一种方法可以在一行上完成所有事情,谢谢所有的答案 编辑2:正确的答案是 selected.Substring((selected.IndexOf('(') + 1), (selec

我在使用substring方法时出现了这个错误

我试图执行以下非常简单的代码:

string bla = selected.Substring((selected.IndexOf('(')+1), (selected.Length-1))
选择的值可以是blabla,我只想得到括号内的'bla'

编辑:我想知道是否有一种方法可以在一行上完成所有事情,谢谢所有的答案 编辑2:正确的答案是

selected.Substring((selected.IndexOf('(') + 1), (selected.Length - selected.IndexOf('(') - 2))

多亏了西纳特,我犯了一个愚蠢的错误

没那么简单。的第二个参数是长度,而不是结束索引。您还必须检查索引是否>=0,并将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
    }
}

不是那么简单。的第二个参数是长度,而不是结束索引。您还必须检查索引是否>=0,并将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
    }
}

考虑到您介绍的简单场景,这应该是可行的:

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

考虑到您介绍的简单场景,这应该是可行的:

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

你也可以用regex来做,尽管它对那种任务来说有点像重炮

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

你也可以用regex来做,尽管它对那种任务来说有点像重炮

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

根据子字符串,第二个参数是子字符串的长度,然后您可以编码 假设字符串格式正确,而不是空的

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

根据子字符串,第二个参数是子字符串的长度,然后您可以编码 假设字符串格式正确,而不是空的

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

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

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;

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

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;


第二个参数是长度,而不是最后一个位置。如果选择的是空字符串怎么办?谢谢回复,但选择的不是空的,我知道第二个参数是长度有时最好使用正则表达式。@Sinatr是对的,但要澄清的是,第二个参数是要从找到的字符索引中选择的字符数。因此,您正在尝试选择比字符串中剩余的字符更多的字符。因此出现了错误。第二个参数是长度,而不是最后一个位置。如果选择的是空字符串怎么办?谢谢回复,但选择的不是空的,我知道第二个参数是长度有时最好使用正则表达式。@Sinatr是对的,但要澄清,第二个参数是要从找到的字符索引中选择的字符数。因此,您正在尝试选择比字符串中剩余的字符更多的字符。因此出现了错误。一行回答,但假设很少:selected不为null,selected包含,并且它们只出现一次,您需要在两者之间使用文本:blablablabla或blablablabla.data是标准的,我没有指定它,sry。这也是一个很好的解决方案,一行回答,但有几个假设:selected不为null,selected包含,它们只出现一次,您需要在两者之间使用文本:blablabla或blablablabla.data是标准的,我没有指定,sry。这也是一个很好的解决方案哦,天哪,什么是正则表达式?正则表达式的缩写。这是一种高级模式搜索机制。上面的模式告诉c regex实现的Match方法查找由字母数字字符组成的所有单词,这些字母数字字符在符号后面和前面。如果你将来要编程,你迟早要学会。天哪,什么是正则表达式?正则表达式的缩写。这是一种高级模式搜索机制。上面的模式告诉c regex实现的Match方法查找由字母数字字符组成的所有单词,这些字母数字字符在符号后面和前面。如果你将来要编程,你迟早要学会。请不要对局部变量使用l_uu前缀。这将导致代码完全无法读取。请不要对局部变量使用l_uuu前缀。这会导致代码完全不可读。