正则表达式在Emacs中搜索

时间:2010-05-14 14:21:03

标签: regex emacs elisp

我正在尝试编写一些Elisp代码来格式化一堆遗留文件。

这个想法是,如果文件包含"<meta name=\"keywords\" content=\"\\(.*?\\)\" />"之类的部分,那么我想插入一个包含现有关键字的部分。如果找不到该部分,我想将自己的默认关键字插入同一部分。

我有以下功能:

(defun get-keywords ()
      (re-search-forward "<meta name=\"keywords\" content=\"\\(.*?\\)\" />")
      (goto-char 0) ;The section I'm inserting will be at the beginning of the file
      (or (march-string 1)
          "Rubber duckies and cute ponies")) ;;or whatever the default keywords are

当函数无法找到目标时,它返回Search failed: "[regex here]"并阻止其余的评估。有没有办法让它返回默认字符串,并忽略错误?

2 个答案:

答案 0 :(得分:2)

使用re-search-forward的额外选项,并将其结构更像

(if (re-search-forward "<meta name=\"keywords\" content=\"\\(.*?\\)\" />" nil t)
    (match-string 1)
  "Rubber duckies and cute ponies")

答案 1 :(得分:0)

另外,考虑使用漂亮的“rx”宏来编写你的正则表达式;它会更具可读性。

(rx "<meta name=\"keywords\" content=\""
    (group (minimal-match (zero-or-more nonl)))
    "\" />")