当代码使用 < 和 > 编码时,正则表达式匹配 HTML 标签以外的任何内容

Regex to match anything except HTML tags when code is encoded using &lt; and &gt;

我正在尝试使用正则表达式来匹配除 HTML 标签之外的任何文本。我找到了“正常”HTML 代码的解决方案:

<[^>]*>(*SKIP)(*F)|[^<]+

但是,我的代码是使用 &lt;&gt; 而不是 <> 编码的,我无法为此修改上面的正则表达式上班。

例如,给定文本:

Hi &lt;p class=\"hello\"&gt;\r\nthere, how are you\r\n&lt;/p&gt;

我需要匹配“hi”和“there, how are you”。请注意,我还需要匹配不在标签之间的文本,在此示例中为“hi”。

更新:因为我正在使用 ruby 的 gsub,看起来我什至不能使用 *SKIP 和 *F

更新 2:我试图不涉及太多细节,但似乎很重要: 我实际上需要替换文本中的所有空格,但不是那些属于标签的空格,无论是 &lt; ... &gt; 标签还是 <...> 标签。

您可以使用

text = text.gsub(/(&lt;.*?&gt;|<[^>]*>)|[[:blank:]]/m) {  || '_' }

我建议使用 [[:blank:]] 而不是 \s,因为我假设您不想替换换行符。见 Ruby demo.

上面的正则表达式匹配

  • (&lt;.*?&gt;|<[^>]*>) - &lt;,任何零个或多个尽可能少的字符,以及 &gt;<,然后 [=] 以外的零个或多个字符17=] 然后是 >
  • | - 或
  • [[:blank:]] - 任何单个水平空格(您也可以使用 [\p{Zs}\t] 来匹配任何 Unicode 水平空格)。

替换中的 { || '_' } 块表示当第 1 组匹配时,按原样返回第 1 组值,否则返回 _ 作为水平空白的替换。