我找到以下代码来查找文本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;
}
我试图找到第二次出现的索引"< /形式>" (某些网页中的空格不会出现在原始字符串中),但它失败了,尽管它确实存在于文本中。我还剪了一些网页的前缀,所以第二次出现是第一次出现,然后我成功地找到了第一次出现的表达式。
在对此代码的评论之一中,有人写道"如果目标字符串包含换行符,则此正则表达式不起作用。"。
我的两个问题是:
如果目标字符串包含换行符,为什么此代码不起作用?
如何修复此代码,因此它也适用于包含换行符的字符串(替换/删除换行符对我来说不是一个好的解决方案)?
我不会寻找其他技术来做同样的事情。
答案 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的更多信息。