我正在尝试在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
。
这是因为默认情况下正则表达式是贪婪的。所以他们匹配最长的比赛。但是,当我尝试修改它时,通常会将"\\[(.*)\\]"
更改为"\\[(.*?)\\]"
似乎没有任何改变。
如何编写此正则表达式以使其按预期运行?
答案 0 :(得分:2)
答案是将"\\[(.*)\\]"
更改为"\\[([^]]*)\\]"
。
通过阅读问题中链接的regex spec,我们发现使用了POSIX regular expression。不幸的是那些do not support non-greedy matches。
然而,在上面给出的这个特殊情况下有一个解决方法。