如何匹配第一对方括号内的所有内容

时间:2015-02-23 20:10:11

标签: regex sieve-language

我正在尝试在regular expression中创建sieve。我正在使用的筛子的实施是Dovecot Pigeonhole

我订阅了github项目更新,我收到来自github的电子邮件,其主题格式如下:

  

Re:[Opserver]从Exception详细信息页面(#77)在Jira上创建问题

主题行中包含方括号中的项目名称。这是我的筛选脚本的相关部分:

if address "From" "notifications@github.com" {
  if header :regex "subject" "\\[(.*)\\]" {
      set :lower :upperfirst "repository" "${1}";
      fileinto :create "Subscribtions.GitHub.${repository}"; stop;
  } else {
      fileinto :create "Subscribtions.GitHub"; stop;
  }
}

从上面可以看出,我正在将消息移动到适当的项目IMAP文件夹中。因此,上述主题的消息最终会显示在Subscribtions.Github.Opserver

不幸的是,这个脚本存在一个小问题。如果有人在其github问题的标题中添加方括号,则过滤器会中断。例如,如果主题是:

  

[项目] [请看一下] - 非常奇怪的问题

上述过滤器会将邮件移至文件夹Subscribtions.Github.Project] [please look at it,这是完全不合需要的。我希望无论如何都要转移到Subscribtions.Github.Project

这是因为默认情况下正则表达式是贪婪的。所以他们匹配最长的比赛。但是,当我尝试修改它时,通常会将"\\[(.*)\\]"更改为"\\[(.*?)\\]"似乎没有任何改变。

如何编写此正则表达式以使其按预期运行?

1 个答案:

答案 0 :(得分:2)

答案是将"\\[(.*)\\]"更改为"\\[([^]]*)\\]"

通过阅读问题中链接的regex spec,我们发现使用了POSIX regular expression。不幸的是那些do not support non-greedy matches

然而,在上面给出的这个特殊情况下有一个解决方法。

相关问题