【问题标题】:How to find the index of first occurrence of a specific type of character after some substring?如何在某个子字符串之后找到特定类型字符的第一次出现的索引?
【发布时间】:2014-09-25 10:42:55
【问题描述】:

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

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

在上面的示例中,我通过查找space 之后的startIndex 找到了endIndex。这是错误的,只是一个例子。我有一个要求,只要有任何alphanumericspecial characters 出现,就停止搜索,space 除外。

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

【问题讨论】:

  • 我发现你的帖子很难理解,不得不重读几次才能得到你想要的。我已经彻底编辑了您的帖子及其标题,试图让您更清楚地了解您的意图和问题。请检查我的更改,如果我有错误,请更正!
  • @quetzalcoatl 好的,谢谢,根据我的要求,它是正确的..

标签: c# regex string linq indexof


【解决方案1】:

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]+

【讨论】:

  • 确定要添加什么来为alphanumericspecial characters定界。
  • 在这种情况下,将第三行中的[\w]+ 替换为[\s]+。这将在任何非空格(如字母、数字或符号)上结束匹配。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    首先,如果您想在子字符串出现之后找到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 开始查找空格,您将找到foxjumping 之间的空格(!) .

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

    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)。所以,效果是一样的。

    您可以将正则表达式中的字符集调整为您想要查找的任何分隔符,但请注意遵守正则表达式语法。或者,您可以将示例表达式替换为您希望分隔符成为的任何公式。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2018-11-21
      • 2021-07-29
      • 2021-09-11
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      相关资源
      最近更新 更多