多个匹配的 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))
使用下面的正则表达式尝试捕获 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))