为什么这个用于查找第n次出现的函数对带换行符的文本不起作用?

时间:2014-09-22 17:42:16

标签: c# regex

我找到以下代码来查找文本here中第n次出现的值。

这是代码:

public static int NthIndexOf(this string target, string value, int n)
{
    Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}");

    if (m.Success)
        return m.Groups[2].Captures[n - 1].Index;
    else
        return -1;
}

我试图找到第二次出现的索引"< /形式>" (某些网页中的空格不会出现在原始字符串中),但它失败了,尽管它确实存在于文本中。我还剪了一些网页的前缀,所以第二次出现是第一次出现,然后我成功地找到了第一次出现的表达式。

在对此代码的评论之一中,有人写道"如果目标字符串包含换行符,则此正则表达式不起作用。"。

我的两个问题是:

  1. 如果目标字符串包含换行符,为什么此代码不起作用?

  2. 如何修复此代码,因此它也适用于包含换行符的字符串(替换/删除换行符对我来说不是一个好的解决方案)?

  3. 我不会寻找其他技术来做同样的事情。

2 个答案:

答案 0 :(得分:1)

正则表达式匹配直到行结束。

根据您的需要,您需要使用Singleline mode,因此您的代码应如下所示:

 Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}", RegexOptions.Singleline);

答案 1 :(得分:1)

默认情况下,正则表达式以新行结束。要修复它,您需要指定正则表达式选项

Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}", RegexOptions.MultiLine);

您可以找到有关RegExOptions here的更多信息。