【问题标题】:RegEx matching for URLs in HTML正则表达式匹配 HTML 中的 URL
【发布时间】:2019-06-04 19:27:24
【问题描述】:

我目前将此作为我的命令,用于从 HTML 中以 href 开头的行中删除 URL:

sed -ne 's/.*href="\([^"]*\).*/\1/p'

由于href 可以以'" 开头,而我的命令现在只占",我想知道如何让'" 都使用该命令帐户。

【问题讨论】:

  • s/.*href=("|')\([^"]*\).*/\1/p 将同时识别 "'

标签: html regex bash shell sed


【解决方案1】:
/^(<)(.*?)(href=)("|')(.*?)(>)$/gm

Demo

or|

() 帮助您逐步对字符串进行分组。

这当然不是最好的,但该在线工具可能会对您有所帮助。

【讨论】:

  • 在一个由' 分隔的衬里中,可以使用\x27 代替',例如/...("|\x27).../。每个元素(它们捕获)周围都不需要括号,除了它们之后的部分周围的括号,.*?,并且必须分隔交替,("|\x27)。这也可以通过非捕获的(?:"|\x27) 来完成。 ?: 使括号捕获(记住)它们之间的内容,而仅对这些内容进行分组。
  • (上面的评论是建设性的/有帮助的,等等——而不是批评!)
  • 是的,看起来不错,除了括号。他们“捕获”,因此内部匹配的内容在$1(第一个括号)、$2(第二个括号)等中。所以只捕获以后需要的内容。根据只有 URL 的问题判断,所以我只在 .*? 之前放置括号 &gt; (与 URL 匹配)。但是,我们还必须将它们放在交替位置("|') 周围,以将其与其余部分分开。由于以后不需要,请使用(?:)(使用?:,它们不会“捕获”,而只是分组)。所以我会说/^&lt;.*?href=(?:\x22|\x27)(.*?)(?:\x22|\x27)&gt;$/gm,然后在$1 中提供URL。
  • [继续...] 我还为 close 引号添加了模式。所以捕获的(.*?)实际上只是URL。否则,(.*?) 本身也会捕获结束引号。
  • 对——一件事是效率低下,而且(对我而言)不需要的捕获的问题是,以后更难跟踪我需要哪个$N!如果我实际上只需要一件事,并且只捕获那个,那么我知道它是$1 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多