上下文替换是否有标准?

时间:2016-03-30 04:23:51

标签: regex vim vi

在vi中,对于行

  

aaaj

我运行命令:

  

.S / A * \ |焦耳/ X /克

该行转为

  

XJ

而不是预期的

  

XX

这是vi的错误吗? sed,gawk和nawk表现得如预期的那样,例如:

og

另外,如果不是上面的命令,我运行命令

  

.S / J \ | A * / X /克

(" j"和" a *"交换),然后该行将成为" xx"如预期的那样。

1 个答案:

答案 0 :(得分:3)

这里的“问题”是a*子模式,它是交替中第一个可以匹配空字符串的分支

当引擎找到aaa时,a*替代分支与三个a匹配,substitute将所有分支替换为x。然后,引擎尝试在 3 a s + 1之后的位置再次匹配(参见source code comments)。

请注意,a*始终匹配,“获胜”,j永远不会匹配。这是因为优先顺序,第一个分支总是在Vim正则表达式中胜出。如果您替换aaaj jjj,它将转为xjx xjxjxj,因为该模式将匹配不匹配字符之前的每个位置。

正确的模式

当用正则表达式替换时,通常不希望匹配与模式不匹配的字符之间的所有空位置,因此,逻辑解决方案是使用+量词, a\+\|j模式