Emacs 贪婪搜索-向后正则表达式

5
如何使emacs中的反向正则表达式搜索变得贪婪?
例如,我在我的缓冲区中有abc 163439 abc,然后我运行以下regexp:163439\|3。无论如何,这个regexp都会在缓冲区中找到'3',但不是整个长数字。因为当它开始搜索时,它首先会遇到“3”。第二次尝试时,它将从“3”的位置开始搜索,也就是数字内部,并排除掉它。
我该如何找到最长且最接近的匹配?
我的意思是,当它遇到“3”时,我希望它检查是否匹配部分不是更大的匹配的组成部分。
3个回答

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

我不认为你能做到你想要的。

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

在你的例子中,Emacs会正确地找到与你的正则表达式匹配的第一个实例。

--dmg


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

但是在另一种情况下,例如:13,这个不会匹配3 - Necto
实际上,优化正则表达式的方式取决于您想匹配的内容。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接