2009-09-01 130 views
0

我想写一个正则表达式匹配这样的模式:用正则表达式不匹配,在结束

<td style="alskdjf" /> 

即自终止<td>

但不是这样的:

<td style=alsdkjf"><br /></td> 

我最初想出了:

<td\s+.*?/> 

但显然未能在第二个例子中,我想这样的事情可能工作:

<td\s+.*?[^>]/> 

但事实并非如此。我正在使用C#.NET。

只寻找<td>的有一个属​​性。例如寻找<td style="alsdfkj" />但不是<td>

回答

4

这将匹配你在找什么,而不是你有没有跟你第一次试了几次有问题的情况下匹配:

<td[^>]*?/> 

但是请注意,如果你需要,允许在属性值>字符,你需要这样的事:

<td(?:[^>]|"[^"]*?")*?/> 

这允许>仅在匹配的双引号(你可以同样展开它允许单引号)。

你可以添加任何你正在寻找的特定属性到正则表达式;例如用于你的例子:

<td[^>]*? style="alskdjf"[^>]*?/> 
4

由于HTML不规则,所以使用正则表达式与HTML会产生问题。我建议使用HTML解析器来处理所有情况,但非常简单。

+0

这取决于案件。像OP所试图匹配的那样的自终止标签实际上是规则的,只要属性值中没有'>'字符。 – Amber 2009-09-01 21:19:57

+0

当然,除非你想匹配语法等价的。 – 2009-09-01 21:36:29

+0

正确。但是,您可以再次扩展正则表达式来匹配它 - 只需在模式的'/ td>'部分之前添加'(><)?'。 – Amber 2009-09-01 23:18:29

2

正则表达式会产生严重的麻烦解释杂乱的HTML一样,是那种浏览器通常要处理。可以对标记进行各种各样可怕的混淆,你只是不想考虑!

HTML Agility Pack是你真正想使用的,并且在我见过的任何地方都有非常好的评论。它是一个强大的库,用于将任何类型的损坏的HTML读入DOM模型。我个人认为它是一个极好的图书馆,肯定有其他图书馆,许多人在商业应用环境中使用图书馆。