我有一个字符串,我想在其中找到特定子字符串出现的位置:
int startIndex = str.IndexOf(substr);
int endIndex = str.IndexOf(" ", startIndex);
在上面的示例中,我通过查找endIndex
之后的space
找到了startIndex
。这是错误的,只是一个例子。除了alphanumeric
之外,我需要尽快停止搜索special characters
或space
。
我知道在Regex的帮助下我们可以做到这一点,但是在我的代码中没有得到如何将它与IndexOf
结合起来。如何完成,或如何找到所需的endIndex
?
答案 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开始寻找空格,您将会在fox
和jumping
之间找到空格{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)。所以,效果是一样的。
您可以将正则表达式中的字符集调整为您想要查找的任何分隔符,只需注意遵循正则表达式语法即可。或者,您可以使用您想要分隔符的任何公式替换示例表达式。