【问题标题】:Select each instance of a pattern, inside a pattern, with regex?使用正则表达式在模式内选择模式的每个实例?
【发布时间】:2021-09-22 23:11:00
【问题描述】:

我正在尝试从标题中的 HTML ID 中删除空格,并将它们替换为 - 字符。到目前为止,我一直在做一个多步骤的过程。我想使用正则表达式将其浓缩为一步。我一直在尝试制作一个正则表达式模式,该模式将在变量模式中突出显示字符的实例,但我没有取得太大的成功。

正则表达式应在此处替换 2 个空格:

<h2 id="three word sentence">

这里的正则表达式应该替换 3 个空格:

<h2 id="four words in sentence">

这是我目前所拥有的,它可以找到每个项目的完整 ID。然后我打开“在选择中查找”并将空格替换为-

(?<=<h[234] id=").*(?=")

如何一步找到空格?

【问题讨论】:

  • RegExp 不是处理类似 HTML/XML 标记的好工具,您确实应该考虑使用适当的 HTML 解析器来完成此操作,并对每个 id 值执行简单的字符串替换。
  • @esqew 谢谢。我现在正在做的是在 Sublime Text 中创建链接的查找和替换自动化,以根据标题添加 ID,然后适当地格式化 ID。我以前没有使用过 HTML 解析器——你能告诉我应该研究什么吗?

标签: regex replace html-parsing sublimetext


【解决方案1】:

你可以使用

(?:\G(?!\A)|<h\d+\s+id=")[^"\s]*\K\s+(?=[^"]*")

请参阅regex demo详情

  • (?:\G(?!\A)|&lt;h\d+\s+id=") - 上一个成功匹配的结尾或&lt;h,一个或多个数字,一个或多个空格和id=" 字符串
  • [^"\s]* - 除了" 和空格之外的零个或多个字符
  • \K - 匹配重置运算符,将匹配的文本从整体匹配内存缓冲区中丢弃
  • \s+ - 一个或多个空格
  • (?=[^"]*") - 一个正向前瞻,需要除 " 之外的零个或多个字符,然后在当前位置右侧紧接一个 " 字符。

【讨论】:

  • 太棒了!谢谢!我以前没有使用过 \G(?!\A) 或 \K,这些是我丢失的部分!谢谢你教我一些新东西。另外我不认为你可以在前瞻中使用 *?!
  • @RCS 您可以在任何正则表达式风格的前瞻中使用* 量词。
  • 很好,我现在有足够的积分来投票! :)
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多