如何在某个子字符串后找到特定类型字符首次出现的索引?

时间:2014-09-25 10:42:55

标签: c# regex string linq indexof

我有一个字符串,我想在其中找到特定子字符串出现的位置:

int startIndex = str.IndexOf(substr);
int endIndex = str.IndexOf(" ", startIndex);

在上面的示例中,我通过查找endIndex之后的space找到了startIndex。这是错误的,只是一个例子。除了alphanumeric之外,我需要尽快停止搜索special charactersspace

我知道在Regex的帮助下我们可以做到这一点,但是在我的代码中没有得到如何将它与IndexOf结合起来。如何完成,或如何找到所需的endIndex

3 个答案:

答案 0 :(得分:3)

Regex.Match有一个位置参数。您可以使用它从字符串中的起始点进行搜索。

这是一个例子。请注意,正则表达式匹配任何单词字符。这假设您的帖子中有拼写错误,并且您实际上想要在遇到任何 - 字母数字或特殊字符时划界。

string s = "This is an example, and it contains a comma.";
int startIndex = s.IndexOf("example");
Regex r = new Regex(@"[\w]+");
Match m = r.Match(s, startIndex);
int endIndex = m.Success ? m.Index + m.Length : -1;

如果您确实想在遇到字母数字或特殊字符时立即划分,请将正则表达式的模式更改为[\s]+

答案 1 :(得分:0)

以下是一个没有边界检查的解决方案。

var charIndexAfterSubString = mainString.IndexOf(charToFind, 
                               mainString.IndexOf(substring) + substring.Length);

答案 2 :(得分:0)

首先,如果你想在子字符串出现之后找到endIndex ,那么你当前的代码还有一个缺陷:

int startIndex = str.IndexOf(substr);
int endIndex = str.IndexOf(" ", startIndex);

您正在从endIndex搜索startIndex权限。假设你的STR和SUBSTR是:

pos: 0123456789012345678901234567890123456789012
str: The quick brown fox jumps over the lazy dog
sub: fox jumping
                     ^  !

此处,indexOf(sub)会返回16^),如果您从16开始寻找空格,您将会在foxjumping之间找到空格{1}}(!)。

要开始在子字符串之后查找,您必须..开始在子字符串之后查找,而不是在子字符串处查找

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' '○'并且' v'。所以,它会击中' o'在' over'。

您可以将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]表达式的匹配(这意味着:任何字符,如R O V)。所以,效果是一样的。

您可以将正则表达式中的字符集调整为您想要查找的任何分隔符,只需注意遵循正则表达式语法即可。或者,您可以使用您想要分隔符的任何公式替换示例表达式。