Search code examples
regexnotepad++

How can I do a non greedy regex query in notepad++?


I am writing a paper with latex and accidentally wrote \cite[] instead of \cite{}. I could just go over the whole document by hand but I want to know how to do this in notepad++ using regexes.

I initially tried \\cite\[(.*)\] and replace with \cite{\1} which works for simple cases such as

\cite[hello world] blah blah 

However if there are two or more citations in a paragraph it matches all of them. So for example

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

matches the whole line

How can I get a non greedy match so that the above line would be matched as 3 separate matches and the result of a replace command should give me

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

Solution

  • Use a reluctant (aka non-greedy) expression:

    \\cite\[(.*?)] 
    

    See a live demo.

    The addition of the question mark changes the .* from greedy (the default) to reluctant so it will consume as little as possible to find a match, ie it won't skip over multiple search terms matching start of one term all the way to the end of another term.

    ie using .* the match would be

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

    but with .*? the matches would be:

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

    Minor note: ] does not need escaping.