2012-08-06 178 views
1

我有一些字符串,就像FFS\D46_24\43_2我想返回第一个反斜杠和最后一个下划线之间的文本。在上面的例子中的情况下,我想D46_24\43删除字符串的特定部分

我尝试下面的代码,但它抛出参数超出范围exepction的:

public string GetTestName(string text) 
    { 
     return text.Remove(
      text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase) 
      , 
      text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase) 
      ); 
    } 

回答

8

第二个参数是一个数,而不是一个结束索引。此外,隔离部分字符串的正确方法是Substring而不是Remove。所以你必须写它作为

var start = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase); 
var end = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase); 

// no error checking: assumes both indexes are positive 
return text.Substring(start + 1, end - start - 1); 
3

第二个参数不是结束索引 - 它应该是要删除的字符数。

请参阅the documentation这个过载。

int startIndex = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase); 
int endIndex = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase) 

return text.Remove(startIndex, endIndex - startIndex); 
1

这是正则表达式的工作。

var regex = new Regex(@"\\(.+)_"); 
var match = regex.Match(@"FFS\D46_24\43_2"); 

if(match.Success) 
{ 
    // you can loop through the captured groups to see what you've captured 
    foreach(Group group in match.Groups) 
    { 
     Console.WriteLine(group.Value); 
    } 
} 
+0

...现在你有两个问题。 ;-)你正在使用'Groups [1]' - 如果输入字符串是“@”FFS \ D46-24 \ 43_2“'? – 2012-08-06 12:20:25

+0

@DanPuzey真实而好的一点 - 只是在这种情况下提供一个例子。我会重新写它更安全。 – 2012-08-06 12:22:27

1

使用正则表达式:

Match re = Regex.Match("FFS\D46_24\43_2", @"(?<=\\)(.+)(?=_)"); 
if (re.Success) 
{ 
    //todo 
} 
0

您应该使用,而不是删除子串。 试试这个:

public static string GetTestName(string text) 
    { 
     int startIndex = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase); 
     int endIndex = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase); 

     if (startIndex < 0 || endIndex < 0) 
      throw new ArgumentException("Invalid string: no \\ or _ found in it."); 

     if (startIndex == text.Length - 1) 
      throw new ArgumentException("Invalid string: the first \\ is at the end of it."); 

     return text.Substring(startIndex + 1, 
           endIndex - startIndex - 1); 
    } 
0
string text = @"FFS\D46_24\43_2"; 
int startIndex = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase), 
    lastIndex = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase); 

return text.Substring(startIndex + 1, lastIndex-startIndex-1);