【问题标题】:How to match one word or another in Elisp regexp如何在 Elisp 正则表达式中匹配一个或另一个单词
【发布时间】: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]不正确(我想匹配srchref)。然后我使用以下正则表达式:

"<[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\\) 效果很好。

【问题讨论】:

  • 这样的? \\(&lt;a href=\"\\|&lt;img src=\"\\)\\(.*\\)\\(\"&gt;image link&lt;/a&gt;\\|\" /&gt;\\)
  • 如果你还没有尝试过,M-x re-builder,你会喜欢的。只需将您的示例 html 代码粘贴到主缓冲区中,然后将您建议的正则表达式粘贴在重新构建器缓冲区中的引号之间。每个匹配的区域都以不同的颜色突出显示,您可以在重新构建器缓冲区中使用正则表达式来查看它是否创建了匹配项。在我的示例中,second 区域匹配 ../link.png../image.png
  • @lawlist 哦,谢谢你的正则表达式,它提醒我 | 需要转义......所以,它应该是 \\(src\\|href\\) 并且它有效,愚蠢的错误......还有,感谢re-builder的命令,我以前从来不知道,真的很有帮助。 :-)

标签: regex emacs elisp


【解决方案1】:

这个特殊的正则表达式涵盖了原始海报示例中的前两项,例如 &lt;a href="../link.png"&gt;image link&lt;/a&gt;&lt;img src="../image.png" /&gt;。我看到没有必要排除原始海报示例中的第三项,因为它不包含在以下正则表达式中:

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

原始海报的正则表达式未涵盖第一个示例的一部分——即,即使我们修复了\\(src\\|href\\),正则表达式也不考虑image link&lt;/a&gt;。因此,我的建议是设计一个包含整个 html 链接的正则表达式。

【讨论】:

    【解决方案2】:

    来点更简单的怎么样:

    (src|href)=".*"

    http://regexpal.com/ 测试过这个

    【讨论】:

    • 其实我已经修复了,因为在elisp regexp中,|应该被转义为\\|,不过,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多