正则表达式忽略捕获组内的可选HTML标记

时间:2014-07-16 12:01:39

标签: regex vb.net

我只是想说我是VB.Net用户并且我知道关于HTML和正则表达式的所有问题。这仅仅是为了我自己的学习,所以请不要建议其他方法。

现在是HTML

<td class="alt1 username"><a href="member.php?123-Stack" class="username">Stack</a>
<td class="alt1 username"><a href="member.php?456-Overflow" class="username"><font color="#FF0000"><strong>Overflow</strong></font></a>

现在您可以看到可选的字体和字符串标记。我当前的模式将捕获第一个示例罚款,但也包括可选标签。我知道为什么我的模式失败只是不确定如何包含可选标签。也许这不可能?

(?<=<a href=""member\.php\?\d+\-.+?"" class=""username"">).+?(?=</a>)

一如既往地谢谢

1 个答案:

答案 0 :(得分:0)

在不区分大小写的模式下使用它:

[^<>]+(?=(?:\s*</(?!a>)[^>]*>)*\s*</a>)

查看the regex demo中的匹配项。

获取VB.NET中的所有匹配项:

Dim ResultList As StringCollection = New StringCollection()
Try
    Dim RegexObj As New Regex("[^<>]+(?=(?:</(?!a>)[^>]*>)*</a>)", RegexOptions.IgnoreCase)
    Dim MatchResult As Match = RegexObj.Match(SubjectString)
    While MatchResult.Success
        ResultList.Add(MatchResult.Value)
        MatchResult = MatchResult.NextMatch()
    End While
Catch ex As ArgumentException
    'Syntax error in the regular expression
End Try

<强>解释

  • [^<>]+匹配既不是<也不是>的字符(这是您的匹配)
  • 前瞻(?=(?:</(?!a>)[^>]*>)*</a>)声称接下来是......
  • (?:</(?!a>)[^>]*>)*零个或多个不是</a>的标记,即</后面没有a>,然后是非>个字符,然后是{{ 1}}
  • 然后是结束>

扩展规范

如果您希望正则表达式只在类</a>出现时匹配,请改用:

username