正则表达式选择正则表达式的子集选择

时间:2015-07-23 15:24:39

标签: regex sublimetext2

我没有幸运地搜索这个,我相信这是因为我不知道用来解释我在寻找什么的关键术语。我有以下正则表达式,我用来区分一组HTML页面上的内部链接和外部链接:

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

所以它不会从:

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

但是会从

中选择“/foo/bar.html”
<a href="/foo/bar.html">bar</a>

这很有效。现在我想对选定的字符串“/foo/bar.html”进行子选择,以仅隔离“.html”部分。这可能吗?可能有一个子串或另一个lookbehind / forward?我在这里设置了一个例子:

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

这适用于Sublime Text Editor中的全局查找/替换。所以我相信我只限于这个正则表达式。我理解变量查找/替换是可能的,但我无法找到实际操作的示例。

编辑:为了澄清,我必须区分外部/内部链接的正则表达式很有效(尽管评论者注意到这一点并不完美)。问题是如何只选择匹配的“.html”部分。

提前致谢!

1 个答案:

答案 0 :(得分:3)

这似乎可以解决问题:

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

这个想法:

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

您可能遇到的问题:

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

虽然你也可以建立正则表达式来处理这些问题。

为了解决目标问题,我们放弃了后视和最后的预测:

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

现在我们匹配一个以<a开头并在其中寻找href="的字符串。通过删除(?=">),我们可以处理包含许多标记的锚点。

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

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

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

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

并根据需要更改$1(最多为FILENAME.EXTENION的部分)和$2(FILENAME.EXTENSION)。

一个例子是:https://www.regex101.com/r/gZ6bP5/3