2012-04-20 80 views
1

这里是我的正则表达式:正则表达式不工作的C#

href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+)) 

,这里是我有:

"<p>dfhdfh</p>\r\n<p><a href=\"/Content/blabla/345/344\">najnov</a></p>\r\n<p>&nbsp;</p>\r\n<p><a href=\"/Content/blabla/345/323:test 1\">test 1&nbsp;</a></p>" 

但m.Groups是:

{href="/Content/blabla/345/344"} 
{/Content/blabla/345/344} 

如何获得第二个href在m?

这里是我的代码:

Match m = Regex.Match(myString, "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))", RegexOptions.IgnoreCase); 
       if (m.Success) 
       { 
        for (int ij = 0; ij < m.Groups.Count; ij++) 
         myString = myString.Replace(m.Groups[ij].Value.Substring(7), m.Groups[ij].Value.Substring(m.Groups[ij].Value.LastIndexOf("/") + 1)); 
       } 
+5

[您不应该试图用正则表达式解析HTML。](http://stackoverflow.com/a/1732454/41071)改为使用HTML解析器,比如HTML Agility Pack。 – svick 2012-04-20 09:47:34

+0

另外,你能告诉我们你的代码实际上使用你的正则表达式吗? – svick 2012-04-20 09:48:52

+0

@svick有它。 – 2012-04-20 09:53:07

回答

1

从这个测试使用RAD software RegEx designer

此正则表达式返回多个匹配,每个匹配中的一个。所以你不应该试图从组中得到你的结果(命名为“1”),你应该迭代匹配的集合并检索每个组的值(或每个组中的值)。

这是获取输出结果:

output from RAD RegEx designer

所以,你应该调用代码Regex.Matches,并通过结果,而不是Regex.Match迭代。

1

除了HTML /正则表达式的东西,要立即获取所有结果,使用Matches,该方法返回MatchCollection包含所有找到Match对象。

请参阅msdn上的The MatchCollection and Match Objects

0

我要去承担原始字符串是这样的:

<p>dfhdfh</p> 
<p><a href="/Content/blabla/345/344">najnov</a></p> 
<p>&nbsp;</p> 
<p><a href="/Content/blabla/345/323:test 1">test 1&nbsp;</a></p> 

..和你贴的是字符串文字你会用它来创建的字符串。让所有的href属性出来的就是这样简单:

Regex r = new Regex(@"href\s*=\s*(?:""(?<HREF>[^""]*)""|(?<HREF>\S+))"); 

foreach (Match m in r.Matches(htmlString)) 
{ 
    Console.WriteLine(m.Groups["HREF"].Value); 
} 

我通过更名捕获组来HREF要清楚,我们正在通过其检索组,不它的数量。

正如你所看到的,你正在做一些你不需要做的工作。