【问题标题】:How to use regex to format a comma separated map structure如何使用正则表达式格式化逗号分隔的地图结构
【发布时间】:2013-02-08 21:02:00
【问题描述】:

使用文本编辑器,无需编写 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    
)

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

【问题讨论】:

  • 如果你用 vim 标记它,有一天你会把记事本扔掉。 :)
  • 使用脚本语言(例如 Perl、Python、Ruby 等)来执行更改。这就是这些工具的用途。尤其是因为您可以嵌套 map 语句...您需要编写一个解析器。
  • @Kent ok :) 好笑我没想到要找一个基于 windows 的 vim,刚下载了一个,会试试
  • @JackManey 是的,我会默认这样做,但希望有一种方法可以在编辑器中使用快捷方式来做到这一点,我想答案只是编写一个 sublime text 2 python 插件(我相信你也可以对 vim 做同样的事情)。只是想知道是否有任何方法可以单独使用正则表达式......

标签: regex vim notepad++ sublimetext2


【解决方案1】:

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 模式下输入&lt;leader&gt;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
)

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

  • 我把窗口一分为二,只显示功能
  • 我在函数之后创建了一个映射
  • 我做了两个嵌套的map,也是为了缩短线,我只用了k#v#

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

【讨论】:

    【解决方案2】:

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

    查找:

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

    替换:

    \n\t\1
    

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

    【讨论】:

    • 哦,...的意思是“等等”(例如,对的数量是未知的)。好的,有道理,所以 Regex 是分词器/词法分析器,我需要一个解析器来从中生成 AST(或类似的东西?)
    • 我对这些术语没有太多经验(我只是在 Wiki 上搜索过它们),但这听起来很准确。
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多