使用下面的正则表达式尝试捕获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))
请咨询
答案 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))