2013-04-30 3 views
4

Как сделать обратный поиск регулярного выражения жадным в emacs?emacs жадный search-backward-regexp

К примеру, у меня есть abc 163439 abc в моем буфере, и я бегу М-х-поиска в обратном направлении-регулярному_выражению со следующим регулярным выражением: 163439\|3. Это регулярное выражение будет всегда находить «3» в буфере, но новее всего длинное число. Потому что, когда он начнет поиск, он сначала встретит «3». Во второй попытке она начнется с позиции «3», которая находится внутри номера, и она опустит ее.

Как найти самый длинный и самый близкий матч?

Так что я имею в виду, когда он встречается с «3», я хочу, чтобы он проверял, не соответствует ли совпадающая часть большей части.

ответ

1

Я не думаю, что вы можете делать то, что хотите.

Emacs search-backward-regexp ищет ближайший экземпляр, который соответствует регулярному exprssion. Речь идет не о жадности (жадность в регулярных выражениях заключается в сопоставлении как можно большего количества символов, когда есть оператор kleene star - или его синтаксические варианты? Или +).

В вашем примере emacs правильно находит первый экземпляр, который соответствует вашему регулярному выражению.

--dmg

1

На вопрос несколько лет назад, ответ был: это не реализовано.

Может попробовать это:

(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)))) 
1

Как сказал DMG, в какой-то степени вы «не можете» сделать это: регулярное выражение двигатель Emacs только соответствует вперед, так что «назад» часть относится только к поиску, а не в матче. Обычно лучше всего изменить ваше регулярное выражение, чтобы не полагаться на жадность. Например. использование \<\(?:163439\|3\).

+0

Но это не будет соответствовать '3' в другой ситуации, например .:' 13' – Necto

+0

Действительно, способ уточнения регулярного выражения зависит от того, что вы хотите совместить. – Stefan

Смежные вопросы