使用 GREP / Regex 将 url 中的下划线替换为给定的 url 扩展名

Replace underscore with dash in url for given url extensions using GREP / Regex

我使用 BBEdit。 BBEdit 支持多文件搜索和 GREP 替换。使用这个(从 Notepad++ post 复制到 ):

(\bhref="|(?!^)\G)[^"<_]*\K_

我可以获得所有包含下划线的 URL 的列表。这个想法是用破折号替换所有下划线。没问题,BBEdit 搜索面板有一个 'Replace with' 字段(类似于 Notepad++)。

一切都很好,但是我实际上不想处理所有 URL。例如,文件下载 URLs 应保持原样,尤其是带有 .exe、.zip、.sit 和 .dmg 扩展名的 URLs。实际上,我要处理的 URLs 是 .php 和 .html url。

我的意思是这种URL应该在这里找到:

<a href="software/internet-tools/ftp-disk_sheet_us.php">

但不是这个:

<a href="software/internet-tools/ftp-disk_us_setup.exe">

到目前为止,我已经尝试编辑上面的 REGEX,但没有成功,因为我必须处理 600 个文件中的大约 30,000 个 url,所以我真的很想确保我没有做错任何事。

非常感谢你帮我解决这个问题。

只有当 link 以 .html/.htm.php:

结尾时才可以强制匹配
(?:\G(?!^)|\bhref="(?=[^"]*\.(?:html?|php)"))[^"<_]*\K_
                   ^^^^^^^^^^^^^^^^^^^^^^^^^

regex demo

(?=[^"]*\.(?:html?|php)") 正前瞻将需要除 " 以外的任何 0+ 个字符,然后是 . 后跟 htm/htmlphp 紧跟在 href=" 之后,否则将找不到匹配项。

详情

  • (?:\G(?!^)|\bhref="(?=[^"]*\.(?:html?|php)")) - 上一场比赛结束 (\G(?!^)) 或 (|)
    • \bhref=" - 整个单词 href 后跟 ="
    • (?=[^"]*\.(?:html?|php)") - 正向前瞻,需要以下模式序列立即匹配到当前位置的右侧:
      • [^"]* - "
      • 以外的 0+ 个字符
      • \. - 一个点
      • (?:html?|php) - 匹配 htm 的非捕获组,然后是可选的 lphp
      • " - 双引号
  • [^"<_]* - 除了 "<_
  • 之外的任何 0+ 个字符
  • \K - 匹配重置运算符,丢弃目前匹配的所有文本
  • _ - 下划线。