首先,如果您想在子字符串出现之后找到endIndex ,那么您当前的代码还有一个缺陷:
int startIndex = str.IndexOf(substr);
int endIndex = str.IndexOf(" ", startIndex);
您正在从startIndex 中搜索endIndex。假设您的 STR 和 SUBSTR 是:
pos: 0123456789012345678901234567890123456789012
str: The quick brown fox jumps over the lazy dog
sub: fox jumping
^ !
这里,indexOf(sub) 返回 16(^),如果您从 16 开始查找空格,您将找到fox 和 jumping 之间的空格(!) .
要开始在子字符串之后查找,您必须.. 开始在子字符串之后,而不是在子字符串。
int startIndex = str.IndexOf(substr);
int endIndex = str.IndexOf(" ", startIndex + substr.Length);
如果您想保留您的代码,这是您需要的第一次更正。
第二件事不是寻找空格,而是寻找你想要的实际分隔符。在 .Net String 类中,您不仅具有查找一个字符的 IndexOf 方法,还具有查找一组字符并返回第一个匹配项的位置的 IndexOfAny 方法。例如:
var chars = new [] { 'r', 'o', 'v' };
int startIndex = str.IndexOf(substr);
int endIndex = str.IndexOfAny(chars, startIndex + substr.Length);
pos: 0123456789012345678901234567890123456789012
str: The quick brown fox jumps over the lazy dog
sub: fox jumping
^ ?!
这将开始查看fox jumps 之后的空格(因为我像以前一样添加了 substr.length),并将查找 'r' 'o' 和 'v' 的任何。所以,它会在 'over' 中击中 'o'。
您可以将chars 数组调整为您想要查找的任何分隔符。
要从某个集合中查找字符,您还可以使用 Regex 类。这个例子和上面的 IndexOfAny 完全一样:
var regex = new Regex("[rov]");
int startIndex = str.IndexOf(substr);
var match = regex.Match(str, startIndex + substr.Length);
int endIndex = match.Index;
pos: 0123456789012345678901234567890123456789012
str: The quick brown fox jumps over the lazy dog
sub: fox jumping
^ ?!
正则表达式将开始查找fox jumps 之后的空格(如前所述),并将查找[rov] 表达式的匹配项(这意味着:任何字符,如RO V)。所以,效果是一样的。
您可以将正则表达式中的字符集调整为您想要查找的任何分隔符,但请注意遵守正则表达式语法。或者,您可以将示例表达式替换为您希望分隔符成为的任何公式。