1

使用文本编辑器,无需编写 JavaScript 函数(例如,不能使用这个很好的答案:Replacing the nth instance of a regex match in Javascript

我该如何处理这样的事情(我无法控制的专有代码结构)

map(key1, value1, key2, value2, key3, value3, key4, value4 ...)

并将其转换为

map(
  key1, value1,
  key2, value2,
  key3, value3,
  key4, value4 
  ...
)

我发现的一个选项是使用这个正则表达式来查找每个第二个逗号 (([^,]*,){2})

然后替换为\1\n\t

但我想改进它:

1. 没有很好的处理第一行和最后一行

 map(key1, value1,
    key2, value2,
    key3, value3,
    key4, value4 ...)

2. 仅适用于平面结构

例如,我想不出一种方法来改变它

map(key1, value1, key2, map(key3, value3, key4, value4 ...), key5, value5)

对此

map(
  key1,value1,
  key2,map(
    key3,value3,
    key4,value4 
  ),
  key5,value5    
)

使用正则表达式,还是有办法?

4

2 回答 2

3

Eran,哦,你终于用 标记了这个问题vim,太好了!^_^

vim可以格式化一下,我写了一个小函数:

请注意,我用作\r换行符,如果它不适合您,请更改为\n

function! ExpandMap()
    let s = line('.')
    exec 'silent s/(/(\r/g'
    let e = line('.')
    exec 'silent '.s.','.e.'s/),\=/\r&\r/g'
    let e = line('.')
    exec 'silent '.s.','.e.'s/,[^,]*\zs,\ze/,\r/g'
    let e = line('.')
    exec s.','.e.' normal =='
endfunction

.vimrc如果你经常使用它,你可以把它放在你的文件中。您也可以通过键入来尝试一下:so %

您可以通过以下方式为该函数调用创建映射:

`nnoremap <leader>r :call ExpandMap()<cr>`

这样,如果您想重新格式化您的map行,只需将光标移动到该行,并在Normal模式类型<leader>r(默认为 \)

这个功能会变

map(k1, v1, k2,  map(k3, v3, k4, v4), k5, v5, k6, map(k7, v7,k8,v8,k9,v9),k10,v10,k11,v11)

进入

map(
        k1, v1,
        k2,  map(
            k3, v3,
            k4, v4
            ),
        k5, v5,
        k6, map(
            k7, v7,
            k8,v8,
            k9,v9
            ),
        k10,v10,
        k11,v11
)

在这里,我展示了它是如何工作的:

  • 我把窗口一分为二,只显示功能
  • 我在函数之后创建了一个映射
  • 我制作了两个嵌套地图,也是为了缩短线条,我刚刚使用过k#v#

在此处输入图像描述

现在,你什么时候卸载你的记事本++?^_^

于 2013-02-09T01:36:29.643 回答
1

一个非常基本的实现,在文本方向替换“向下”。

寻找:

([^(,)]+,[^(,)]+)

代替:

\n\t\1

请注意,这不起作用...(那是什么?),并且它不会对嵌套深度做任何花哨的事情。跟踪嵌套深度将需要一个具有超出正则表达式能力的解析器。解析一种编程语言和解析 HTML一样难。

于 2013-02-08T21:21:01.080 回答