c# Regex 忽略文本周围的可选标签

c# Regex ignore optional tags around text

问题:

假设我有以下字符串:

<p><span style=\"font-weight:bold;\">Description:</span>Thomas is currently
 developing a enterprise resource management course for Pluralsight </p>

我正在尝试 regex.replace 删除 <span style=\"font-weight:bold;\">Description:</span>

通常,开始标记和结束标记都不会出现,因此这两个标记都必须是可选的。他们也不会总是跨度。我唯一可以保证的是"Description:"这个词会出现。

我试过的:

这是我所能得到的最接近的结果:

(?:<.*>)?Description:(?:<\/.*>)?

不幸的是,起始捕获组也正在捕获起始 p 标签。我需要做到不超过 1 个开始或结束标记。

还有当我用它的时候:

Regex.Replace(text, @"(?:<.*>)?Description:(?:<\/.*>)?", "")

我被退回了

</span>Thomas is currently developing a enterprise resource management course for Pluralsight </p>

不应该捕获的结束 span 标签和缺少起始 p 标签...

编辑: 尽管与@kblok 发布的帖子类似,但我只想删除第一个周围的标签(如果存在)。这个线程是关于删除所有周围的标签。因此我删除 p 标签的问题

假设您不需要担心带引号的尖括号,您可以使用

(?:<[^<]*>)?Description:(?:<\/[^<]*>)?

改进模式以强制执行 start/end 标签名称匹配并仅在描述周围,同时删除描述:当标签不存在时。

(?:(?<open><)(?<start>[^ >]+)[^<>]*>)?Description:\k<open>\/?\k<start>>|Description:

此模式明确排除 <p> 个标签。

(?:<(?!p>|/)[^<>]*>)?Description:(?:</[^<>]*>)?

这个也是一样的,但是对开始和结束标签的匹配更加严格。它还允许在标签

之间使用白色 space
(?:<(?!p>|/)(?<tag>[^ >]+)(?=[ >])[^<>]*>)?\s*Description:\s*(?:<\/\k<tag>[^<>]*>)?

考虑到 VDWWD 的警告,考虑到所有可能的 HTML 格式变化,即使是这个丑陋的东西也可能有点幼稚,但它至少应该与您所描述的格式正确的简单情况相匹配。