2011-08-10 132 views
1

我有一个包含下面的一行代码的多次出现某些页面内容:C#正则表达式匹配可选

<li class="r"><h3><a href="/test-url.htm">test string</a></h3></li> 

我使用.NET正则表达式来查找内容的所有事件,并返回我的HREF的锚标签。

我的问题是,有时<li>有引号类缠(如上图所示),但其他人没有,只是有:class=r

我需要对阵双方的匹配和不带引号。

我试过各种方法,但似乎没有任何工作。有报价时,它们全都匹配,但不是没有报价。下面是我当前的尝试:

Regex _Regex = new Regex(@"<li class=(?:"")g([^>])*>((?!<h3).)*<h3([^>])*><a\shref=""(?<URL>[^""]*)""([^>])*>((?!</li).)*", RegexOptions.IgnoreCase); 

任何帮助是非常赞赏,

感谢。

+0

正则表达式不擅长处理HTML。如果你只是想找到重复,你可能会更好使用xpath –

+2

我知道我没有回答你的问题,但你不应该使用正则表达式来解析HTML。改为使用[Html Agility Pack](http://htmlagilitypack.codeplex.com/)会更好。 – Justin

+0

+1这个想法,非常好用。 – Marc

回答

5

我认为你想要的格式是

“”?

问号标志着前面的字符为可选。

+0

这工作完美:)感谢您的帮助。 –

0

这是正则表达式的一部分。我想你知道如何finigh它:

<li class=["r]+?> 

<li class=["]?r["]?> 

他们两人的作品。

1

诀窍是匹配并捕获可选的第一个引号,因此该组最终包含一个引号或一个空字符串。然后,在单词末尾使用反向引用来再次匹配相同的内容。

@"<li class=(""?)r\1[^>]*>" 

在一个侧面说明,这将出现在您的正则三次,这是错误的:([^>])*。它匹配你想要它,但它只有捕获最后一个字符。如果需要捕获这些段,则应该在组内移动星号。如果你不需要需要捕获它,只需要像我一样摆脱括号。