我在使用子串方法时遇到此错误。
我正在尝试执行这个非常简单的代码:
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,我犯了一个愚蠢的错误
答案 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;