使用GREP / Regex将URL扩展名中的下划线替换为破折号

3

我使用BBEdit。BBEdit支持使用GREP进行多文件搜索和替换。使用以下方法(从stackoverflow中的Notepad ++帖子复制):

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

我可以获取所有包含下划线的URL列表。想法是将所有下划线替换为破折号。这没有问题,BBEdit搜索面板有一个“替换为”字段(就像Notepad ++)。
一切都很好,但我不想实际处理所有URL。例如,应该保留文件下载URL,特别是具有.exe、.zip、.sit和.dmg扩展名的URL。实际上,我想要处理的URL是.php和.html URL。
我的意思是应该在这里找到这种类型的URL:
<a href="software/internet-tools/ftp-disk_sheet_us.php">

但不包括下面这个:

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

我已经尝试过编辑上面的正则表达式,但迄今为止没有成功,由于我需要在600个文件中处理大约30,000个URL,因此我真的希望确保我不会出错。

非常感谢您提前帮助我解决这个问题。


请编辑您的帖子并向我们展示您想要处理/匹配的URL以及您想要保持不变的文本。 - Corion
1个回答

2
你只能在链接以 .html/.htm.php 结尾时强制匹配:
(?:\G(?!^)|\bhref="(?=[^"]*\.(?:html?|php)"))[^"<_]*\K_
                   ^^^^^^^^^^^^^^^^^^^^^^^^^

请看正则表达式演示(?=[^"]*\.(?:html?|php)") 正向前瞻会要求在 href=" 后立即出现任何0+个不是 " 的字符,然后是一个点,接着是 htm/html 或者 php,否则将找不到匹配项。 详情
  • (?:\G(?!^)|\bhref="(?=[^"]*\.(?:html?|php)")) - 上一个匹配的结束(\G(?!^))或(|)
    • \bhref=" - 一个完整的单词 href 后面跟着 ="
    • (?=[^"]*\.(?:html?|php)") - 一个正向前瞻需要以下模式序列立刻匹配到右边:
      • [^"]* - 0+个非 " 的字符
      • \. - 一个点
      • (?:html?|php) - 一个不捕获的组,匹配 htm 后跟一个可选的 l 或者 php
      • " - 一个双引号
  • [^"<_]* - 任意0+个非 ", <_ 的字符
  • \K - 匹配重置操作符,抛弃到现在为止匹配的所有文本
  • _ - 一个下划线。

1
我可以确认这个表达式完美地工作了。我在600个文件中处理了大约28,000次出现。 - Stan Busk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接