5

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

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

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

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

4

3 回答 3

2

我不认为你可以做你想做的事。

Emacs search-backward-regexp 搜索与正则表达式匹配的最接近的实例。这与贪婪无关(正则表达式中的贪婪是在存在 kleene 星号运算符时匹配尽可能多的字符 - 或其语法变体?或 +)。

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

--dmg

于 2013-04-30T17:33:30.743 回答
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))))
于 2013-04-30T19:21:34.017 回答
1

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

于 2013-05-04T23:12:45.747 回答