regsub -all多次匹配不起作用

时间:2015-04-17 14:32:48

标签: tcl

使用下面的正则表达式尝试捕获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 {,\1,[\2],[],[],[\3],\4} 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))

请咨询

1 个答案:

答案 0 :(得分:1)

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

% regsub -all {,(pf2\([y|n]),\[(.*)\],\[(.*)\],(.)} $test {>>>>,\1,[\2],[],[],[\3],\4<<<<}
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 {,\1,[\2],[],[],[\3],\4}
hk,pf2(y,[],[],[],[],n),[y:0],flags(no,no,no)),hk,pf2(y,[],[],[],[],n),[y:0],flags(no,no,no))