Как я могу выполнить не жадный запрос регулярного выражения в блокноте ++?

Я пишу статью с латексом и случайно написал \cite[] вместо \cite{}. Я мог бы просто просмотреть весь документ вручную, но я хочу знать, как это сделать в блокноте ++ с использованием регулярных выражений.

Сначала я попробовал \\cite\[(.*)\] и заменил его на \cite{\1}, который работает для простых случаев, таких как

\cite[hello world] blah blah 

Однако, если в абзаце есть две или более цитаты, он соответствует всем из них. Так например

\cite[aaa]\cite[bbb] something here \cite[ccc]

соответствует всей строке

Как я могу получить не жадное совпадение, чтобы указанная выше строка соответствовала 3 отдельным совпадениям, а результат команды замены должен был дать мне

\cite{aaa}\cite{bbb} something here \cite{ccc}

person twerdster    schedule 24.08.2013    source источник
comment
Лучше вообще использовать более точное выражение. Вместо использования: \[.*\] или: \[.*?\] более эффективно использовать: \[[^[\]]*\]. Говори, что ты имеешь в виду, имеешь в виду то, что говоришь!   -  person ridgerunner    schedule 24.08.2013


Ответы (2)


Используйте выражение неохотно (иначе не жадное):

\\cite\[(.*?)] 

См. живую демонстрацию.

Добавление вопросительного знака изменяет .* с "жадного" (по умолчанию) на "неохотный", поэтому он будет потреблять как можно мало, чтобы найти совпадение, т.е. он не будет пропускать несколько поисковых запросов, соответствующих началу один семестр до конца другого семестра.

т.е. при использовании .* совпадение будет

foo \cite[aaa]\cite[bbb] something here \cite[ccc] bar
    ^----------------------1---------------------^

но с .*? совпадения будут:

foo \cite[aaa]\cite[bbb] something here \cite[ccc] bar
    ^---1----^^----------------2-----------------^

Незначительное примечание: ] не требует экранирования.

person Bohemian♦    schedule 24.08.2013
comment
К сожалению, у меня это не работает. Я вставил образец строки, который я написал в вопросе, в блокноте ++, а затем использовал ваше регулярное выражение, и он ничего не соответствует. - person twerdster; 24.08.2013
comment
Я добавил ссылку, показывающую, что регулярное выражение работает. Может быть, проверьте это и дайте мне знать, в чем, по вашему мнению, у вас возникла проблема. Будьте осторожны, чтобы не ставить пробелы в конце регулярного выражения, когда вы его используете - я заметил, когда я скопировал его, чтобы проверить его, я обнаружил некоторые конечные пробелы, которые мешали ему работать должным образом. - person Bohemian♦; 24.08.2013
comment
@Bohemian Я ценю усилия. Мой вопрос был направлен на движок регулярных выражений notepad ++. Ваше регулярное выражение там не работает. - person twerdster; 24.08.2013
comment
Какую версию Notepad ++ вы используете? У меня работает в NPP v6.4.5. Ищу \\cite\[(.*?)\] и заменяю на \\cite{\1}. - person Alan Moore; 24.08.2013
comment
@AlanMoore Это исправило. - person twerdster; 24.08.2013
comment
у меня это не работает в 7.7.1. Если только я не упускаю что-то очевидное ... но регулярное выражение для меня не является чуждым понятием, и то, что я делаю, довольно тривиально, поэтому я не могу представить, чего бы мне не хватало ... поиск по тексту faa<>foo<>bar<>baz<>OK для <>.*?<>.*?<>OK дает мне последние 3 «жетона» вместо последних двух «жетонов» - person searchengine27; 02.07.2021
comment
@ searchchengine27 да, потому что первый <> совпадает между faa и foo. и .*? соответствует foo<>bar. Как и ожидалось. То, что вы на самом деле хотите сопоставить, не является ничем (то есть точкой), а скорее не <, т.е. [^<], так что <>[^<]*?<>[^<]*?<>OK, но теперь не делайте ' Мне даже нужен вопросительный знак, так что <>[^<]*<>[^<]*<>OK сделает это. Это общий шаблон, часто встречающийся при сопоставлении текста с разделителями, например "[^"]*". - person Bohemian♦; 02.07.2021
comment
ну, я подумал, что использование этого примера может сделать его более конкретным, но вы правы, я только заставил его. Фактическое выражение, которое я пытался проверить, на самом деле было .*?<>.*?<>OK, что также не удалось. - person searchengine27; 02.07.2021

Лучше в первую очередь использовать более точное выражение:

\\cite\[([^[\]]*)\]

Вы должны использовать Notepad ++ версии 6 или выше (они обновлены до механизма регулярных выражений PCRE в V6).

person ridgerunner    schedule 24.08.2013