正则表达式用于在使用 < 编码代码时匹配除 HTML 标记之外的任何内容和 >

Regex to match anything except HTML tags when code is encoded using < and >

提问人:raquelhortab 提问时间:11/25/2021 最后编辑:raquelhortab 更新时间:11/25/2021 访问量:104

问:

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

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

但是,我的代码是使用 and 而不是 和 编码的,我无法修改上面的正则表达式以使其正常工作。&lt;&gt;<>

例如,给定文本:

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

我需要匹配“嗨”和“那里,你好吗”。请注意,在此示例中,我还需要匹配不在标签之间的文本“hi”。

更新:由于我使用的是 ruby 的 gsub,看起来我什至不能使用 *SKIP 和 *F

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

正则表达式 ruby html 解析 ruby-1.9.3

评论

0赞 Wiktor Stribiżew 11/25/2021
你能用吗?(?s)&lt;.*?&gt;
0赞 The fourth bird 11/25/2021
它可能就像 regex101.com/r/TjrIOo/1&lt;(?:(?!&gt;)[\s\S])*&gt;(*SKIP)(*F)|(?:(?!&lt;)[\s\S])+
0赞 raquelhortab 11/25/2021
@WiktorStribiżew这是一个好主意,我可以使用拆分,但我需要重建文本,我正在使用 ruby 的 gsub,通过使用拆分,我会丢失标签的内容
0赞 raquelhortab 11/25/2021
@Thefourthbird哦,这很完美!但我刚刚尝试过,看起来 ruby (1.9.3) 不支持 *SKIP 和 *FAIL......我要更新这个问题
1赞 raquelhortab 11/25/2021
那太完美了!!难道它对两者都有效吗 <>< >标签?我将在描述中更详细地解释这个问题,您可以将其作为答案发布,以便我可以选择它作为解决方案。你刚刚救了我真头疼,非常感谢你,我会“买咖啡”的

答:

1赞 Wiktor Stribiżew 11/25/2021 #1

你可以使用

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

我建议不要,因为我假设您不想替换换行符。查看 Ruby 演示[[:blank:]]\s

上面的正则表达式匹配

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

替换中的块意味着当组 1 匹配时,组 1 值将按原样返回,否则将作为水平空格的替换返回。{ $1 || '_' }_