5

emacsで後方正規表現検索を貪欲にする方法は?

たとえばabc 163439 abc、バッファに があり M-x search-backward-regexp 、次の正規表現で実行します: 163439\|3. この正規表現は常にバッファ内で '3' を見つけますが、より新しい long 番号全体を見つけます。なぜなら、検索を開始すると最初に「3」にあうからです。2 回目の試行では、数字の内側にある「3」の位置から開始され、省略されます。

最長で最も近い一致を見つけるにはどうすればよいですか?

つまり、「3」に出会ったときに、一致した部分がより大きな一致の部分ではないかどうかを確認したいのです。

4

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))))
于 2013-04-30T19:21:34.017 に答える
2

あなたがやりたいことはできないと思います。

Emacs search-backward-regexp は、正規表現に一致する最も近いインスタンスを検索します。これは貪欲ではありません (正規表現での貪欲とは、kleene スター演算子 (またはその構文上の変種である ? または +) がある場合に、できるだけ多くの文字を一致させることです)。

あなたの例では、emacs は正規表現に一致する最初のインスタンスを適切に見つけます。

--dmg

于 2013-04-30T17:33:30.743 に答える
1

dmg が言ったように、ある程度は「できません」: Emacs の正規表現エンジンは前方のみに一致するため、「後方」の部分は検索にのみ適用され、一致には適用されません。通常、最善の策は、欲に頼らないように正規表現を変更することです。例を使用します\<\(?:163439\|3\)

于 2013-05-04T23:12:45.747 に答える