【问题标题】:Regex capture and replace %20 after last forward slash正则表达式在最后一个正斜杠后捕获并替换 %20
【发布时间】:2015-08-16 18:59:30
【问题描述】:

我有一个 tsv 文件,里面有很多 HTML。

我需要在非 .jpg 链接的 href 属性的最后一个正斜杠之后替换 %20。 我正在命令行上尝试使用 Perl,我需要正则表达式方面的帮助。

我尝试了一些正则表达式,这是在现场测试中(下面的链接):

<a\ [^>]*href="([^"]+(%20)+)[^\.jpg][^\/]"[^>]?>

它只匹配一个&lt;a&gt; 标签并且只捕获最后一次出现的%20

Here a live test with a sample of tsv.

我可以:

<a href="http://example.com/path/to-some-folder/another%20folder/one%20more520folder/34%20-%20kv34%20-%20tomba%20di%20thumtmose%20iii">text</a>

我必须匹配最后一个正斜杠之后的所有%20,并将它们替换为-

或:

<a href="http://example.com/path/to-some-folder/another%20folder/one%20more520folder/uploads/2012/02/some%20folder/another%20folder/09%20antichi%20egizi%20-%20Tomba%20di%20Tutankhamen.jpg"> <img border="0" src="http://example.com/path/to-some-folder/another%20folder/one%20more520folder/uploads/2012/02/some%20folder/another%20folder/09%20antichi%20egizi%20-%20Tomba%20di%20Tutankhamen%20ante.jpg" width="80" height="92" alt="09 antichi egizi - Tomba di Tutankhamen" /></a>

不得匹配 .jpg 的 href 属性,因此上面的最后一个示例需要保持不变。

我也试过这个匹配所有预期的&lt;a&gt; 标签,但我不知道如何在最后一个斜杠之后仅捕获所有%20 以随后应用替换:

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

https://regex101.com/r/cS3iB6/2

【问题讨论】:

  • 您需要使用 HTML 解析器仅提取 a 标签的 href 属性。 Obligatory link
  • [^\.jpg] 这并不意味着你认为它是什么..
  • 嘿 karthik - 如果我昨天从你的正则表达式中正确学习 - 它可能是 (?!\.jpg)。
  • @Falt4rm 是的......它可能是......
  • @glenn jackman,谢谢你的链接,我是 Kaitlin Duck Sherwood,他准确地解释了我现在需要什么。

标签: regex bash perl replace command-line


【解决方案1】:

在非 .jpg 链接的 href 属性的最后一个正斜杠后替换 %20

你可以使用以下来匹配:

%20(?=(?:(?!\.jpg">)[^>\/])*>)

并替换为-

DEMO

【讨论】:

  • 这种方法的基本缺陷是你没有检查你是否在&lt;a&gt;标签中,你只检查匹配后是否没有.jpg。如果扩展名是png 怎么办?您需要扩展替代列表。在某些标记中获取所有匹配项的真正方法是 \G 运算符。
  • @stribizhev 你说得对.. 我这样做是因为我们没有验证模式.. 只是从预先存在的模式中替换.. 所以我所做的假设没有问题.. 也.. OP想要non .jpg链接..我认为我的解决方案已经足够好了..
  • @stribizhev 在这种情况下,我只有 jpg 但会很有趣,看看你将如何使用 \G 运算符?
【解决方案2】:

为了匹配某些分隔符内的%20,您还可以使用\G 运算符(参见"Where You Left Off: The \G Assertion"):

您可以使用\G 指定上一场比赛之后的位置。

你可以使用的正则表达式是

(<a\b[^<]*?|(?<!^)\G)([^\/]*?)%20(?=(?![^\/]*\.jpg">)[^\/"]*">)

替换为

\1\2-

这里是my demo

在类似 Perl 的符号中,它看起来像

s/(<a\b[^<]*?|(?<!^)\G)([^\/]*?)%20(?=(?![^\/]*\.jpg">)[^\/"]*">)/\1\2-/g

【讨论】:

  • 我不认为这个解决方案适合大文本,但它很精确。
猜你喜欢
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2021-11-18
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多