C#Regex在两个字符串之间使用通配符字符串获取字符串?

时间:2016-08-09 17:40:17

标签: c# html regex tags wildcard

我知道有人会以某种身份提出这个问题 - 但我还没有看到解决方案的实例。我知道有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,但忽略在idstyle之前或之后发生的任何事情?

2 个答案:

答案 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;'捕获组中的字符。