我知道有人会以某种身份提出这个问题 - 但我还没有看到解决方案的实例。我知道有Html Agility Pack来解析HTML字符串,但我不想下载/安装它。我使用
获取网页的内容string html = client.DownloadString("http://yoursite.com/page.html");
我有一个带有类的标签,但其中一些标签也有自己的ID或样式等,例如:
<td>I Dont want this</td>
<td class="myClass">I want this</td>
<td class="myClass" id="myID">I want this</td>
<td style="border-top-width: 0px; class="myClass">I want this</td>
我试过
<td>(.*?)</td>
但它返回的标签没有任何类,id等。
我试过
<td class="myClass"[^>]*>(.*?)</td>
但它只返回第二个和第三个<td>
值,但不返回第四个值。如何添加通配符以使用<td>
返回任何myClass
,但忽略在id
或style
之前或之后发生的任何事情?
答案 0 :(得分:0)
这只会识别<td
是否具有class或id属性
如果有的话,它会通过。
如果您只需要一个类值且id是可选的,请更改条件
到(?(class)|(?!))
找到开始标记后,此方法只是找到下一个闭包
(请注意,它不会检查开头<td
是否为自包含标记
如果可能的话,在原子组之后添加(?<!/>)
,即(?&gt; ..)(?<!/>)
)
class和id值位于其命名的捕获组中。
逐字
@"(?is)<td(?=\s)(?>(?:(?<=\s)class\s*=\s*""(?<class>[^""]*)""|(?<=\s)id\s*=\s*""(?<id>[^""]*)""|"".*?""|'.*?'|[^>]*?)+>)(?(class)|(?(id)|(?!))).*?</td\s*>"
扩展
(?is)
< td # 'td' tag, or any tag for that matter
(?= \s )
(?> # Atomic grouping
(?:
(?<= \s )
class \s* = \s* # 'class' attribute
"
(?<class> # 'class' value
[^"]*
)
"
| (?<= \s )
id \s* = \s* # 'id' attribute
"
(?<id> # 'id' value
[^"]*
)
"
| " .*? "
| ' .*? '
| [^>]*?
)+
>
)
(?(class) # Conditional - Only tags with our 'class' or 'id' attr/value
|
(?(id)
| (?!)
)
)
.*?
</td \s* >
顺便说一句,在你的最后一行<td style="border-top-width: 0px; class="myClass">I want this</td>
上
style 值包含class = part
style="border-top-width: 0px; class="
答案 1 :(得分:0)
应该这样做:<td(.+|)(class="myClass")(.+|)>(.+)<\/td>
实例:https://regex101.com/r/gG6gH0/2
但是如果列表是任何不同的格式,那么你描述的那样你必须排除'&lt;' ,'&gt;'捕获组中的字符。