【发布时间】:2014-03-10 04:53:02
【问题描述】:
我有一个包含html代码的字符串,如下:
...
<a href="../link.png">image link</a>
...
<img src="../image.png" />
...
<pre class="should_not_match">...</pre>
...
我想提取所有资源路径:a 中的href 中的../link.png,以及img 中的src 中的../image.png。现在我有以下代码:
(with-temp-buffer
(insert html-content) ;; html-content is the content mentioned above
(beginning-of-buffer)
(while (re-search-forward "<[a-zA-Z]+[^/>]+[src|href]=\"\\([^\"]+\\)\"[^>]*>" nil t)
(message (match-string 1))
;; more code here
))
输出不仅包括想要的../link.png,../image.png,还包括should_not_match,我知道这是因为正则表达式中的[src|href]不正确(我想匹配src或href)。然后我使用以下正则表达式:
"<[a-zA-Z]+[^/>]+(src|href)=\"\\([^\"]+\\)\"[^>]*>"
但它现在返回nil。我也尝试了以下方法,但没有运气:
"<[a-zA-Z]+[^/>]+\\(src|href\\)=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+((src)|(href))=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+(\\(src\\)|\\(href\\))=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+\\((src)|(href)\\)=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+\\(\\(src\\)|\\(href\\)\\)=\"\\([^\"]+\\)\"[^>]*>"
那么,正确的正则表达式是什么?
提前致谢,
开尔文
编辑
受@lawlist 启发,我发现这是因为我需要用\\| 转义|,所以\\(src\\|href\\) 效果很好。
【问题讨论】:
-
这样的?
\\(<a href=\"\\|<img src=\"\\)\\(.*\\)\\(\">image link</a>\\|\" />\\) -
如果你还没有尝试过,
M-x re-builder,你会喜欢的。只需将您的示例 html 代码粘贴到主缓冲区中,然后将您建议的正则表达式粘贴在重新构建器缓冲区中的引号之间。每个匹配的区域都以不同的颜色突出显示,您可以在重新构建器缓冲区中使用正则表达式来查看它是否创建了匹配项。在我的示例中,second 区域匹配../link.png和../image.png -
@lawlist 哦,谢谢你的正则表达式,它提醒我
|需要转义......所以,它应该是\\(src\\|href\\)并且它有效,愚蠢的错误......还有,感谢re-builder的命令,我以前从来不知道,真的很有帮助。 :-)