【问题标题】:c# Regex ignore optional tags around textc# Regex 忽略文本周围的可选标签
【发布时间】:2017-07-11 21:07:05
【问题描述】:

问题:

假设我有以下字符串:

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

我正在尝试执行 regex.replace 来删除 &lt;span style=\"font-weight:bold;\"&gt;Description:&lt;/span&gt;

通常开始标签和结束标签都不会出现,所以这两个都必须是可选的。而且它们并不总是跨度。我唯一能保证的是“描述:”这个词会出现。

我的尝试:

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

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

不幸的是,起始捕获组也在抓取起始 p 标签。我需要做到这一点,以使开始或结束标签永远不会超过 1 个。

当我使用它时:

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

我被退回

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

带有不应捕获的结束跨度标记和缺少起始 p 标记...

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

【问题讨论】:

  • 使用正则表达式解析html并不是一个好主意。你会遇到各种各样的问题。有HTML agility pack你可以试试。
  • 我目前正在广泛使用 htmlagilitypack,但在这种情况下,我相信正则表达式会更合适。我的文本中有多个分隔符,我在其中使用正则表达式来分割、突出显示和提取。我不能总是假设分隔符会被包含在 span 标签中。
  • 是否要删除描述:即使它没有任何标签?

标签: c# html asp.net .net regex


【解决方案1】:

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

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

改进的模式以强制开始/结束标签名称匹配和仅描述周围,也删除描述:当标签不存在时。

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

【讨论】:

  • 问题是“通常开始标签和结束标签都不存在”。如果在 Description: 之间没有其他标签,则此模式仍将匹配 &lt;p&gt;
  • 不仅如此,[^&lt;]* 还会匹配到下一个 >,然后需要不必要的回溯。您可以像 *? 那样使 * 不贪婪,或者将 > 放在否定字符类中,或者两者都使用,例如 [^&lt;&gt;]*?
  • 新模式将不匹配“描述:”周围没有任何标签的案例,也不会匹配没有任何属性或额外空格的标签。但要小心,如果你只是将最后一部分包装在一个可选组中,它会再次开始匹配

    。对于同一文本中的多次出现,它还可以匹配下一个“描述:”之前的意外结束标记。

  • 我在描述周围没有标签的情况下运行它,它工作正常 - 它不匹配,所以它什么也不做。我解决了另一个问题。我在问题中没有看到多个描述。
  • 重读问题,决定可以解释为删除说明:即使标签不存在,所以更改了第二个选项。
【解决方案2】:

此模式明确排除 &lt;p&gt; 标记。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多