2014-09-22 36 views
1

我发现下面的代码来找到在文本here中的值的第n次出现。为什么用于查找第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; 
} 

我试图找到“</FORM>”的第二次出现的索引在一些网页(空间不会出现在原始字符串),并且它失败了,虽然它肯定存在于文本中。我也削减了网页的一些前缀,所以第二次出现将是第一次,然后我成功地找到表达式作为第一次出现。

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

我的两个问题是:

  1. 为什么没有如果目标字符串包含换行符此代码的工作?

  2. 我该如何解决这个问题,所以它也适用于包含换行符的字符串(替换/删除换行符对我来说不算是一个好的解决方案)?

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

+0

你能举一个输入和输出的例子吗? – gunr2171 2014-09-22 17:43:54

+0

如果您尝试从HTML中读取数据,则可能需要考虑使用[Html Agility Pack](http://htmlagilitypack.codeplex.com/)而不是[regex](http://stackoverflow.com/问题/ 1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – 2014-09-22 17:49:57

回答

1

正则表达式匹配直到行尾。

你想要的东西,你需要使用Singleline mode,使你的代码应该是这个样子:

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

我总是在Reg Ex上使用多行,并查看你提供的链接,看起来它是两种方式一样的东西。你有什么理由建议单线而不是多线? – 2014-09-22 17:56:04

+1

供您选择。注意在MultiLine中^和$匹配每行的开始和结束。所以你需要将它匹配到适合你的东西 – Mzf 2014-09-22 18:01:52

1

默认情况下,正则表达式最终在新的一行。要解决它,你需要指定正则表达式选项

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

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

相关问题