如何使用正则表达式格式化逗号分隔的地图结构

时间:2013-02-08 21:02:01

标签: regex vim notepad++ sublimetext2

使用文本编辑器,无需编写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。仅适用于平面结构

e.g。我想不出改变这个

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

到此

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

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

2 个答案:

答案 0 :(得分: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#

enter image description here

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

答案 1 :(得分:1)

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

查找

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

替换:

\n\t\1

请注意,这不适用于...(这是什么?),并且它对嵌套深度没有任何兴趣。跟踪嵌套深度将需要具有超出正则表达式的解析器的解析器。解析编程语言与parsing HTML一样难。