emacs贪婪的搜索 - 后退 - 正则表达式

时间:2013-04-30 11:34:45

标签: regex emacs elisp

如何在emacs中使后向正则表达式搜索变得贪婪?

例如,我的缓冲区中有abc 163439 abc,我使用以下正则表达式运行 M-x search-backward-regexp 163439\|3。这个正则表达式总是会在缓冲区中找到“3”,但整个长整数都会更新。因为,当它开始搜索时,它首先会遇到'3'。在第二次尝试中,它将从数字内部的“3”的位置开始,并且将省略它。

如何找到最长和最接近的匹配?

所以我的意思是,当它遇到'3'时,我希望它检查匹配的部分是否不是更大匹配的一部分。

3 个答案:

答案 0 :(得分:2)

我认为你不能做你想做的事。

Emacs search-backward-regexp搜索与常规exprssion匹配的最近实例。这不是关于贪婪(正则表达式中的贪婪是关于在有kleene星运算符时匹配尽可能多的字符 - 或者它的句法变体?或+)。

在您的示例中,emacs正确查找与您的正则表达式匹配的第一个实例。

- DMG

答案 1 :(得分:2)

几年前问到的时候,答案是:它没有实施。

也许试试这个:

(defun ar-greedy-search-backward-regexp (regexp)
  "Match backward the whole expression as search-forward would do. "
  (interactive (list (read-from-minibuffer "Regexp: " (car kill-ring))))
  (let (last)
    (when (re-search-backward regexp nil t 1)
      (push-mark)
      (while (looking-at regexp)
        (setq last (match-end 0))
        (forward-char -1))
      (forward-char 1)
      (push-mark)
      (goto-char last)
      (exchange-point-and-mark))))

答案 2 :(得分:1)

正如dmg所说,在某种程度上你“不能”这样做:Emacs的正则​​表达式引擎仅向前匹配,因此“向后”部分仅适用于搜索,而不适用于匹配。你最好的选择通常是改变你的正则表达式,以免依赖贪婪。例如。使用\<\(?:163439\|3\)