JREPL 匹配包含关键字的 URL

JREPL to match URL that contains keyword

我正在尝试使用 JREPL.bat 来匹配 txt 文件中包含特定术语的 URL(然后将结果写回文件)。

这就是我目前所拥有的,不幸的是它没有返回预期的结果。结果总是 NULL:

JREPL.bat "href=""(\w[^""]+/pdf4v/\w[^""]+)" "" /match /f html.txt /o -

html.txt 看起来如下(实际上文件要复杂得多;附加内容由 [...] 表示):

[...]

<ul>
<li><a href="#" id="fav" onclick="return favoritesadd(8094,'fav.png','removefav.png');"><img id="fav8094" src="fav.png" alt="" border="0" /> <span id="fav8094">ADD TO WISHLIST</span></a></li>
<li class="sixcol right"><a href="https://documents.domain.com/content/updates/year18/jv/folder01/pdf/pdf8094.zip?exp=1567791065&hsh=5a49e7d4828603beddbfb058a1535f5e&dl=att&filename=pdf-00008094-16.pdf" class="tcenter"><img src="pdf.png" class="icon" align="left" />16<br /><span class="small">download pdf</span></a></li>
<li class="sixcol"><a href="https://documents.domain.com/content/updates/year18/jv/folder01/pdf4v/pdf4v8094.zip?exp=1567791065&hsh=246a7702296f7db363ecaa1746a8815a&dl=att&filename=pdf-00008094-40.pdf" class="tcenter"><img src="pdf.png" class="icon"  align="left" />40<br /><span class="small">download pdf</span></a></li>
<div class="clear"></div>
<li><a href="/details.php?id=8094&num=1&ss=1" onclick="$.open();return false;"><img src="/images/details.png" class="center" />Details</a></li>
</ul>

[...]

预期结果是:

https://documents.domain.com/content/updates/year18/jv/folder01/pdf4v/pdf4v8094.zip?exp=1567791065&hsh=246a7702296f7db363ecaa1746a8815a&dl=att&filename=pdf-00008094-40.pdf

有人可以帮忙吗?我不确定为什么这不起作用。

在此先感谢您的帮助!

试试正则表达式:href="(\w[^"]+\/pdf4v\/\w[^"]+)

Demo

可以在具有以下先决条件的批处理文件中使用以下单个命令行:

  1. jrepl.bat 必须在包含包含此行的批处理文件的目录中。
  2. 执行此批处理文件时,文件 html.txt 必须位于当前目录中。
  3. 文件 html.txt 不能在一行中包含多个带有 /pdf4v/ 的 URL。
  4. 文件 html.txt 包含 /pdf4v/ 不在 URL 之外。

批处理文件命令行:

@%SystemRoot%\System32\findstr.exe /R "href=.*/pdf4v/" html.txt | call "%~dp0jrepl.bat" "^.*href=\x22([^\x22]*?/pdf4v/[^\x22]*)\x22.*$" "" /O html.txt

FINDSTR 仅支持非常有限的正则表达式,并且始终输出包含匹配字符串的整行。因此,区分大小写的正则表达式搜索字符串 href=.*/pdf4v/ 查找包含 href=/pdf4v/.

的所有行

这些行由 FINDSTR 输出以处理 STDOUT 由 Windows 命令处理器重定向以处理 STDIN JREPL.BAT.

JREPL.BAT 运行一个更强大的 JScript 正则表达式替换以匹配行上的所有内容,该行肯定包含 href=/pdf4v/ 并带有标记URL 包含 /pdf4v/ 并仅用标记的 URL.

替换该行

搜索表达式 ^.*href="([^"]*?/pdf4v/[^"]*)".*$ 写在批处理文件中,每个 "\x22 因为 cmd.exe 将双引号解释为参数的 begin/end字符串.

有一个更好的解决方案,使用 JREPL.BAT 选项 /MATCH:

@call "%~dp0jrepl.bat" "[^\x22]*?/pdf4v/[^\x22]*" "" /MATCH /F html.txt /O -

搜索表达式 [^"]*?/pdf4v/[^"]* 仅匹配所有由 0 个或多个非双引号字符或非贪婪换行符和 /pdf4v/ 以及 0 个或多个非双引号字符组成的字符串引号或换行符。这非常简单,可能会导致误报,但适用于提供的示例。

遗憾的是,JScript 正则表达式引擎不支持现代正则表达式引擎的后视或其他增强功能,以限制对 href 值的搜索。但是可以使用以下方法避免一些误报:

@call "%~dp0jrepl.bat" "[^\x22]*?/pdf4v/[^\x22]*" "" /INC "/href=\x22[^\x22]*?\/pdf4v\//" /MATCH /F html.txt /O -

不包含 href="[^"]*?/pdf4v/ 的行在应用简单搜索表达式之前被此包含过滤器过滤掉。这仍然不完美,但也许足以完成这项任务。