【问题标题】:How can I do a non greedy regex query in notepad++?如何在记事本++中进行非贪婪的正则表达式查询?
【发布时间】:2013-08-27 06:35:50
【问题描述】:

我正在用乳胶写一篇论文,不小心写了\cite[] 而不是\cite{}。 我可以手动浏览整个文档,但我想知道如何在 notepad++ 中使用正则表达式。

我最初尝试\\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}

【问题讨论】:

  • 最好首先使用更精确的表达式。与其使用:\[.*\] 或:\[.*?\],不如使用:\[[^[\]]*\] 更有效。 言出必行,言出必行!

标签: regex notepad++


【解决方案1】:

使用不情愿(又名非贪婪)表达式:

\\cite\[(.*?)] 

查看live demo

添加问号将.* 从贪婪(默认)更改为不情愿,因此它将消耗尽可能little 来找到匹配项,即它不会跳过多个搜索与一个词的开头一直匹配到另一个词的结尾的词。

即使用.*匹配将是

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

但对于 .*?,匹配项将是:

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

小注:] 不需要转义。

【讨论】:

  • 不幸的是,这对我不起作用。我在记事本++中粘贴了我在问题中写的示例行,然后使用了你的正则表达式,它不匹配任何东西。
  • 我添加了一个显示正则表达式工作的链接。也许检查一下,让我知道您认为您遇到的问题是什么。使用时请注意不要在正则表达式的末尾放置任何空格 - 我注意到当我复制粘贴它以测试它时,我拾取了一些尾随空格,导致它无法正常工作。
  • @Bohemian 我感谢您的努力。我的问题是针对记事本++正则表达式引擎。您的正则表达式在那里不起作用。
  • 您使用的是什么版本的 Notepad++?它在 NPP v6.4.5 中对我有用。我正在搜索 \\cite\[(.*?)\] 并将其替换为 \\cite{\1}
  • @AlanMoore 修复了它。
【解决方案2】:

首先最好使用更精确的表达方式:

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

您必须使用 Notepad++ 版本 6 或更高版本(它们已升级到 V6 的 PCRE 正则表达式引擎)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2011-04-27
    • 2010-10-20
    相关资源
    最近更新 更多