正则表达式到 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)。
我没有找到任何关于这个的运气,我相信那是因为我不知道用来解释我正在寻找的东西的关键术语。我有以下正则表达式,用于区分一组 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)。