You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sieve过滤器body扩展正则捕获变量$1、$2未正常赋值问题

Sieve过滤器正则捕获变量为空的问题

尝试使用body、regex和variables扩展编写Sieve邮件过滤器,极简测试代码如下:

require ["body", "regex", "variables", "vnd.cyrus.log"];

if allof (
   address :is "from" "no_reply@yabbadabba.doo",
   body :regex "message from ([0-9]+) to 456:(.+)"
) {
   log "1 = \"${1}\"";
   log "2 = \"${2}\"";
}

测试邮件原始内容:

To: fred@theflintston.es
Subject: New message from 123 to 456
From: <no_reply@yabbadabba.doo>

Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=UTF-8

-----------------------------------------------------------------------------

message from 123 to 456:hello world

使用Fastmail的Sieve测试工具测试后,输出中$1和$2为空值,但预期应捕获到"123"和"hello world",为何这两个变量未被赋值?


原因及解决方法

核心原因

Sieve的body :regex仅用于判断邮件正文是否匹配指定正则表达式,不会自动将正则捕获组的内容赋值给$1、$2这类全局变量。条件判断阶段的正则匹配仅返回布尔结果,不会存储捕获的分组内容,因此后续代码无法直接引用这些捕获值。

修正方案

需要使用match命令显式执行正则匹配,并将捕获组的内容存入对应变量。修正后的代码示例如下:

require ["body", "regex", "variables", "vnd.cyrus.log"];

if address :is "from" "no_reply@yabbadabba.doo" {
    # 直接对邮件正文执行正则匹配,将捕获组存入$1、$2
    match "${body}" :regex "message from ([0-9]+) to 456:(.+)" into $1, $2;
    
    # 验证捕获结果并输出日志
    if allof(not string :is "${1}" "", not string :is "${2}" "") {
        log "1 = \"${1}\"";
        log "2 = \"${2}\"";
    }
}

修改后,测试工具将正确捕获到"123"和"hello world"并输出对应的日志内容。


内容的提问来源于stack exchange,提问作者Matthew B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:36:16