正则表达式捕获并在最后一次正斜杠后替换%20

时间:2015-06-02 19:50:33

标签: regex bash perl replace command-line

我有一个包含大量HTML的tsv文件。

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

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

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

它仅匹配一个<a>代码,并仅捕获最后一次出现的%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属性,因此上面的最后一个示例需要保持不变。

我也尝试过这个匹配所有预期的<a>代码但我不知道如何在最后一个斜杠后捕获所有%20以便随后应用替换:

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

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

2 个答案:

答案 0 :(得分:2)

  

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

您可以使用以下内容进行匹配:

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

并替换为-

请参阅DEMO

答案 1 :(得分:2)

为了在某些分隔符中匹配Sub ForwardSelectedItems() On Error Resume Next Dim objItem As Outlook.MailItem If Application.ActiveExplorer.Selection.Count = 0 Then MsgBox ("No item selected") Exit Sub End If For Each objItem In Application.ActiveExplorer.Selection Set objMsg = objItem.Forward() With objMsg .Attachments.Add objItem, olEmbeddeditem .Subject = "example" .To = "example@example.com" .Body = “” .Send End With Next Set objItem = Nothing Set objMsg = Nothing End Sub ,您还可以使用%20运算符(请参阅"Where You Left Off: The \G Assertion"):

  

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

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

\G

替换为

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

这是my demo

在类似Perl的表示法中,它看起来像

\1\2-