是否有任何情况下submatch(0)无法在vim regexp替换中工作?

时间:2015-08-30 21:34:56

标签: regex vim

我大致有以下源数据,我试图通过vim的regexp搜索执行全局替换并替换:

      "text": [{
        "uid": "...",
        "left": 50,
        "top": 715,
        "minSize": 60,
        "maxSize": 70,
        "width": "345px",
        "align": "center",
        "font": "...",
        "forbidden": "",
        "border": true,
        "printType": 0
      }

我的搜索/替换字符串如下所示:

:%s/"left": \(\d\+\)/"left": \=submatch(1)*0.66/g

实际上,我试图在所有情况下将"left"属性降低到其当前值的66%。

不幸的是,结果字符串变为:

      "text": [{
        "uid": "...",
        "left": =submatch(1)*0.66,
        "top": 715,
        "minSize": 60,
        "maxSize": 70,
        "width": "345px",
        "align": "center",
        "font": "...",
        "forbidden": "",
        "border": true,
        "printType"

所以,我得到"left": 33而不是"left": =submatch(1)*0.66

起初,我认为这是因为我使用的是=submatch(0)。但是,切换到=submatch(0)并没有解决问题,只是在替换后的字符串中返回=submatch(0)

是否会出现无法正确评估表达式的情况?

1 个答案:

答案 0 :(得分:5)

在替换中使用表达式时,替换必须以\=开头,然后将其余部分计算为表达式。在你的情况下,你刚刚逃过等号。

最简单的方法是使用\zs在数字之前开始匹配

:%s/"left": \zs\d\+/\=submatch(0) * 0.66

然后使用submatch(0)进行整场比赛,在这种情况下只是数字。