正则表达式到 Select 正则表达式的子集 Select

Regex to Select a Sub-Set of a Regex Select

我没有找到任何关于这个的运气,我相信那是因为我不知道用来解释我正在寻找的东西的关键术语。我有以下正则表达式,用于区分一组 HTML 页面上的内部链接和外部链接:

(?<=a href=")[^http](.*?)(\.html")

所以它不会 select “http://www.example.com/foo/bar.html” 来自:

<a href="http://www.example.com/foo/bar.html">bar</a>

但会 select “/foo/bar.html” 来自:

<a href="/foo/bar.html">bar</a>

这非常有效。现在我想在 selected 字符串“/foo/bar.html”上做一个 subselect 来隔离“.html”部分。这可能吗?可能带有子字符串或另一个 lookbehind/forward?我在这里设置了一个例子:

https://www.regex101.com/r/gZ6bP5/2

这适用于 Sublime Text 编辑器中的全局 find/replace。所以我相信我仅限于使用正则表达式。我知道变量 find/replace 是可能的,但我无法找到实际的例子。

编辑: 只是为了澄清,我必须区分 external/internal 链接的正则表达式效果很好(尽管正如评论者所指出的那样不完美)。问题是关于如何 select 只是匹配的“.html”部分。

提前致谢!

这似乎可以解决问题:

(?<=a href=")(?!http)[^"]*\/([^"]+)(?=">)

想法:

  • 使用后视 (?<=a href=") 确保我们处于 link 锚点。
  • 使用前瞻性 (?=">) 确保锚点结束。
  • 使用否定前瞻(?!http) 确保事情不以 http 开头。
  • 使用贪婪匹配 [^"]* 捕获直到最后一个斜线的所有字符,而不跨越引号边界。
  • 抓取捕获组中最后一个斜杠之后但引号边界之前的所有字符 ([^"]+)

您可能遇到的问题:

  • 这是有效的HTML<a target="_blank" href="bob.html">.
  • 这是有效的 link <a href="ftp://bob.html">

尽管您也可以构建正则表达式来处理这些问题。

为了处理目标问题,我们放弃了后视,最后的前视:

<a[^>]*href="(?!http)[^"]*\/([^"]+)

现在我们正在匹配以 <a 开头的字符串并在其中寻找 href="。通过删除 (?=">),我们能够处理带有许多标签的锚点。

要处理 ftp,我们可以执行以下操作:

<a[^>]*href="(?!(http|ftp))[^"]*\/([^"]+)

现在,您可以将字符串的开头包装在捕获组中:

(<a[^>]*href="(?!(http|ftp))[^"]*\/)([^"]+)

并根据需要更改 </code>(到 FILENAME.EXTENION 的部分)和 <code>(FILENAME.EXTENSION)。

示例位于:https://www.regex101.com/r/gZ6bP5/3.