C#Regex获取两个字符串之间的字符串,其中有一个通配符字符串
本文关键字:字符串 通配符 有一个 之间 C#Regex 两个 获取 | 更新日期: 2023-09-27 18:01:27
我知道有人以某种身份问过这个问题,但我还没有看到解决方案的工作示例。我知道有Html敏捷包可以解析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>
值,而不返回第四个。如何添加通配符以返回任何带有myClass
的<td>
,但忽略任何在id
或style
之前或之后的内容?
应该这样做:<td(.+|)(class="myClass")(.+|)>(.+)<'/td>
现场示例:https://regex101.com/r/gG6gH0/2
但是,如果列表的格式与您描述的格式不同,则必须排除'<','>'捕获组中的字符。
这只会识别<td
是否具有class或id属性
如果其中任何一个有,它就通过了。
如果只需要一个类值并且id是可选的,请更改条件
至(?(class)|(?!))
在找到开始标记之后,这个方法只找到下一个闭包
(请注意,它不会检查打开的<td
是否为自包含标记。
如果可能的话,在原子组之后添加(?<!/>)
,即(?>..((?<!/>)
(
类和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=部分style="border-top-width: 0px; class="