多个匹配的 regsub -all 不起作用

regsub -all for multiple match is not working

使用下面的正则表达式尝试捕获 pf2(y,[],[],n) 并在第二个方括号 [] 之后插入 [],[] 就像 pf2(y,[],[], [],[],n)

    set test {hk,pf2(y,[],[],n),[y:0],flags(no,no,no)),hk,pf2(y,[],[],n),[y:0],flags(no,no,no))}

下面的 regsub 适用于最后一场比赛,但并未匹配所有比赛

    regsub -all -- {,(pf2\([y|n]),\[(.*)\],\[(.*)\],(.)} $test {,,[],[],[],[],} test

实际输出:

    hk,pf2(y,[],[],n),[y:0],flags(no,no,no)),hk,pf2(y,[],[],[],[],n),[y:0],flags(no,no,no))

预期输出:

    hk,pf2(y,[],[],[],[],n),[y:0],flags(no,no,no)),hk,pf2(y,[],[],[],[],n),[y:0],flags(no,no,no))

请指教

问题是正则表达式是贪心的,能匹配多少就匹配多少。如果我们做这个轻微的变化,我们可以看到这一点(插入高度可见的标记是在匹配错误的东西时诊断 RE 问题的好方法):

% regsub -all {,(pf2\([y|n]),\[(.*)\],\[(.*)\],(.)} $test {>>>>,,[],[],[],[],<<<<}
hk>>>>,pf2(y,[],[],n),[y:0],flags(no,no,no)),hk,pf2(y,[],[],[],[],n),[y:0],f<<<<lags(no,no,no))

改变量词的贪婪度(.*.*?)让它做你期望的事情:

% regsub -all -- {,(pf2\([y|n]),\[(.*?)\],\[(.*?)\],(.)} $test {,,[],[],[],[],}
hk,pf2(y,[],[],[],[],n),[y:0],flags(no,no,no)),hk,pf2(y,[],[],[],[],n),[y:0],flags(no,no,no))