我是正则表达式的新手:(经过大量搜索我的要求后,我能够管理得到答案,但我确实得到了额外的结果,如下所述:
我的字符串
<td valign="top" width="100%">
<td width="100%" valign="top">
<td valign="top" height="100%" width="100%">
<td valign="top">
我的表达
/<td (?=.*valign="top")(?=.*width="100%").*>/gm
我的结果
<td valign="top" width="100%">
<td width="100%" valign="top">
<td valign="top" height="100%" width="100%">
预期结果
<td valign="top" width="100%">
<td width="100%" valign="top">
结论:我想提取仅具有特定值的valign和width属性的TD标记。
注意:我必须解析大量数据文件,因此HTMLAgility会降低整个过程的速度。
请指导我最后的表达。干杯
答案 0 :(得分:0)
这似乎是为我做的:
\<td\s+((valign="top"\s+width="100%")|(width="100%"\s+valign="top"))\s*>\gm
您的表达式会搜索这两个属性是否位于<td
开头之前的某个位置。这个允许空格,然后搜索valign="top" width="100%"
或width="100%" valign="top"
,然后在td标记结束之前搜索更多可选的空格。这不允许除宽度和valign属性之外的所有属性。
说到这一点,使用正则表达式时总会出现意想不到的情况。你可以在这里实时测试你的正则表达式:http://regexr.com/只需输入你的字符串和正则表达式来查看它的选择。
编辑:
如果您想在属性周围考虑单引号和双引号,请尝试以下方法:
\<td\s+((valign=([",'])top\3\s+width=([",'])100%\4)|(width=([",'])100%\6\s+valign=([",'])top\7))\s*>\gm
现在我允许在属性值的开头添加“或”,并搜索在属性值的末尾找到的匹配项。
再次,我鼓励您访问我上面链接的网站,并自己玩这些。我几乎从不使用正则表达式,但是当我这样做时,我通常可以找到一个适用于该网站的表达式。