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>,但忽略任何在idstyle之前或之后的内容?

C#Regex获取两个字符串之间的字符串,其中有一个通配符字符串

应该这样做:<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="