如何得到一个字符串的特定部分在C#

问题描述:

我有一个字符串如何得到一个字符串的特定部分在C#

string a = "(something is there),xyz,(something there)"; 

和,我用这个

string s = "(something is there),xyz,(something there)"; 
int start = s.IndexOf("(") + 1; 
int end = s.IndexOf(")", start); 
string result = s.Substring(start, end - start); 

,但我想用第二部分(something there) 我该怎么办它?

+1

正则表达式会有所帮助。或者你可以使用'LastIndexOf',或者你可以使用'IndexOf'重载,它允许你指定搜索起始索引(使用最后一次搜索的索引+1)。或者你可以分开','并拿走最后一个元素。 – 2015-02-06 15:46:06

+1

正则表达式有什么问题? '@“\([^()] * \)(?= [^()] * $)“' – 2015-02-06 15:46:16

+0

你是否总是想要第二个'('作为开始还是你总是希望两者的内容? – Hogan 2015-02-06 15:48:26

如果你想获得第二个“(”和“)”之间,然后如果你想获得后的字符串中使用这台开始索引搜索

start = s.IndexOf("(", end) + 1; 
end = s.IndexOf(")", start); 
string secondResult = s.Substring(start, end - start); 

IndexOf第二个参数的文本最后)使用此代码:

string otherPart = s.Substring(end+1); 

您可以使用此:

string s = "(something is there),xyz,(something there)"; 
    var start = s.Split(',')[2]; 

你也可以使用:

 string s = "(something is there),xyz,(something there)"; 
     Regex regex = new Regex(@"\([^()]*\)(?=[^()]*$)"); 
     Match match = regex.Match("(something is there),xyz,(something there)"); 
     var result = match.Value; 
+1

完全搞不清楚为什么有人会对此置之不理,看起来像是* specific *问题的最简单的解决方案作为OP介绍 – 2015-02-06 15:51:13

+0

@MattBurland没问题,我不回答投票 – 2015-02-06 15:52:37

+1

为什么字符串a =必填? – 2015-02-06 15:52:43

不知道到底是什么你解决这个做的,但是这确实是在这种特殊情况下:

var last = s.Split(',').Last(); // "(something there)" 

或者更冗长的解释:

var s = "(something is there),xyz,(something there)"; 

var split = s.Split(','); // [ "(something is there)", "xyz", "(something there)" ] 

var last = split.Last(); // "(something there)" 

如果你不想要括号(英国)

var content = last.Trim('(', ')'); // "something there" 

您可以使用下面的,如果你只是想要的文字:

var s = "(something is there),xyz,(something there)"; 
var splits = s.Split('('); 
var text = splits[2].Trim(')'); 

a.Split("(),".ToCharArray(),StringSplitOptions.RemoveEmptyEntries); 

这将返回数组与3串:something is therexyzsomething there

+0

但是OP不会**需要'xyz'。 – MickyD 2015-02-06 16:16:46

+0

@MickyDuncan - 可能不会 - 要求非常模糊。我认为这是执行'spit()'的最好方法,而其他人没有显示它。 – Hogan 2015-02-06 16:18:55

如果 “最后”在这种情况下,您可以使用“第二个”String.LastIndexOf

string lastPart = null; 
int lastStartIndex = a.LastIndexOf('('); 
if (lastStartIndex >= 0) 
{ 
    int lastEndIndex = a.LastIndexOf(')'); 
    if (lastEndIndex >= 0) 
     lastPart = a.Substring(++lastStartIndex, lastEndIndex - lastStartIndex); 
} 

这里是一个提取从字符串中的所有标记为List<string>的解决方案:如果列表太小

string first = tokens[0]; 
string second = tokens.ElementAtOrDefault(1); 

int startIndex = -1, endIndex = -1; 
var tokens = new List<string>(); 
while (true) 
{ 
    startIndex = a.IndexOf('(', ++endIndex); 
    if (startIndex == -1) break; 
    endIndex = a.IndexOf(')', ++startIndex); 
    if (endIndex == -1) break; 
    tokens.Add(a.Substring(startIndex, endIndex - startIndex)); 
} 

所以,现在你可以使用索引或Enumerable.ElementAtOrDefault你会得到null。如果你只是想最后使用tokens.Last()

+0

可能比其他答案有点冗长? – MickyD 2015-02-06 16:20:10

+0

@MickyDuncan:我提供了一个更详细的方法,可以提取所有部分。 – 2015-02-06 16:40:28