我没有幸运地搜索这个,我相信这是因为我不知道用来解释我在寻找什么的关键术语。我有以下正则表达式,我用来区分一组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”部分。
提前致谢!
答案 0 :(得分:3)
这似乎可以解决问题:
(?<=a href=")(?!http)[^"]*\/([^"]+)(?=">)
这个想法:
(?<=a href=")
确保我们处于链接锚点。(?=">)
以确保锚点结束。(?!http)
以确保不以http开头。[^"]*
捕获最后一个斜杠的所有字符,而不跨越引号边界。([^"]+)
您可能遇到的问题:
<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)。