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

c#Regex忽略文本周围的可选标记,c#,html,asp.net,.net,regex,C#,Html,Asp.net,.net,Regex,问题: 假设我有以下字符串: <p><span style=\"font-weight:bold;\">Description:</span>Thomas is currently developing a enterprise resource management course for Pluralsight </p> 描述:托马斯目前 为Pluralsight开发企业资源管理课程 我正在尝试执行regex.replace以删除说明: 通

问题:

假设我有以下字符串:

<p><span style=\"font-weight:bold;\">Description:</span>Thomas is currently
 developing a enterprise resource management course for Pluralsight </p>
描述:托马斯目前
为Pluralsight开发企业资源管理课程

我正在尝试执行regex.replace以删除
说明:

通常情况下,开始标记和结束标记都不存在,因此这两个标记都必须是可选的。而且,它们也不会一直是跨度。我唯一能保证的是“描述:”这个词会出现

我所尝试的:

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

(?:<.*>)?Description:(?:<\/.*>)?
(?:)?说明:(?:)?
不幸的是,起始捕获组也在捕获起始p标记。我需要这样做,这样就永远不会有超过1个开始或结束标记

同样,当我将其用于:

Regex.Replace(text, @"(?:<.*>)?Description:(?:<\\/.*>)?", "")
Regex.Replace(文本,@“(?:)?说明:(?:)?”,“”)
我要回来了

</span>Thomas is currently developing a enterprise resource management course for Pluralsight </p>
Thomas目前正在为Pluralsight开发企业资源管理课程

它不应该捕获的结束跨度标记和缺少的起始p标记

编辑:
虽然类似于@kblok发布的线程,但我只想删除第一个周围的标记(如果它存在的话)。此线程是关于删除所有周围的标记。因此,我的问题是删除p标记

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

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

此模式明确排除了
标记

(?:<(?!p>|/)[^<>]*>)?Description:(?:</[^<>]*>)?
(?:|/)[^]*>)?说明:(?:)?
这一个也一样,但是在匹配开始标记和结束标记方面更严格。它还允许标记之间留有空白

(?:<(?!p>|/)(?<tag>[^ >]+)(?=[ >])[^<>]*>)?\s*Description:\s*(?:<\/\k<tag>[^<>]*>)?
(?:|/)(?[^>]+)(?=[>])[^]*>)?\s*说明:\s*(?:)?

考虑到VDWWD的警告,即使考虑到所有可能的HTML格式变化,这件丑陋的事情也可能有点幼稚,但它至少应该匹配您所描述的格式良好、简单的情况。

使用正则表达式解析HTML的可能重复不是一个很好的主意。你会遇到各种各样的问题。你可以尝试一下。目前我正在广泛使用htmlagilitypack,但在这种情况下,我相信正则表达式更合适。我的文本中有多个分隔符,我在其中使用正则表达式进行拆分、高亮显示和提取。我不能总是假设分隔符将被包装在span标记中。是否要删除描述:即使它没有任何标记?问题是“通常情况下,开始标记和结束标记都不存在”。如果此模式之间没有其他标记,则该模式仍将匹配
说明:
不仅如此,而且
[^,然后需要不必要的回溯。您可以使*像*一样非贪婪,或将>放在否定字符类内,或两者都放在否定字符类内,如
[^]*?
新模式将不匹配“Description:”周围没有任何标记的案例,也不是没有任何属性或额外空间的标记。但请小心,如果您只是将最后一个部分包装在可选组中,它将再次开始匹配。对于同一文本中的多个匹配项,它还可以匹配下一个“说明:”前面的意外结束标记:。我在描述周围没有标记的情况下运行了它,效果很好-它不匹配,因此没有任何作用。我修复了另一个问题。我在问题中没有看到多个描述。重新阅读问题,决定可以解释为删除描述:即使标记不存在,因此更改了第二个选项。
(?:<(?!p>|/)(?<tag>[^ >]+)(?=[ >])[^<>]*>)?\s*Description:\s*(?:<\/\k<tag>[^<>]*>)?