如何在Elisp regexp中匹配一个或另一个单词

时间:2014-03-10 04:53:02

标签: regex emacs elisp

我有一个包含html代码的字符串,如下所示:

...
<a href="../link.png">image link</a>
...
<img src="../image.png" />
...
<pre class="should_not_match">...</pre>
...

我想提取../link.pnghref的{​​{1}}以及a../image.png的{​​{1}}的所有资源路径。现在我有以下代码:

src

输出不仅包括img(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,我知道这是因为regexp中的../image.png不正确(我想匹配{ {1}}或should_not_match)。然后我使用以下正则表达式:

[src|href]

但它现在返回src。我也试过以下,但没有运气:

href

那么,什么是正确的正则表达式呢?

提前致谢,
开尔文


修改

受@lawlist的启发,我发现这是因为我需要使用"<[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\\)\\)=\"\\([^\"]+\\)\"[^>]*>" 效果很好。

2 个答案:

答案 0 :(得分:2)

此特定正则表达式涵盖原始海报示例中的前两项,例如<a href="../link.png">image link</a><img src="../image.png" />。我认为没有必要排除原始海报示例中的第三项,因为它不包含在以下正则表达式中:

\\(<a href=\"\\|<img src=\"\\)\\(.*\\)\\(\">image link</a>\\|\" />\\)

原始海报的正则表达不包括第一个示例的一部分 - 即,即使我们修复image link</a>,正则表达式也不会考虑\\(src\\|href\\)。因此,我的建议是设计一个包含整个html链接的正则表达式。

答案 1 :(得分:0)

如何做一些简单的事情:

  

| “*”(SRC HREF)=

http://regexpal.com/

中测试过