正则表达式在 Sublime 3 中将 "array()" 更改为“[]”

Regex change "array()" to "[]" in Sublime 3

又一个 RegEx 问题。 我有许多 PHP 文件要从数组 ('foo', 'bar') 更改为新样式 ['foo', 'bar']

到目前为止我想到了这个:

array\(([^\(]*?)\)

但它不接受多行定义。我试过这样的事情,但更糟的是,因为它选择了错误的右括号:

(?s)array\(([^\(].*?)\)

例如需要替换的一些数据:

$foobar = $this->foobar('foo_bar', array(
    'foo'   =>  array('foobar' => array('barfoo')),
    'bar' => array(
        'bar' => 'foobar',
        'foo' => 'barfoo',
)));

所以上面的例子看起来像这样:

$foobar = $this->foobar('foo_bar', [
    'foo' => ['foobar' => ['barfoo']],
    'bar' => [ 
        'bar' => 'foobar',
        'foo' => 'barfoo',
 ]]);

有人吗?谢谢!

该正则表达式在跨行匹配时应该没有问题,但它是不正确的。 [^\(].*? 确保左括号后的第一个字符不是另一个左括号,但在那之后,任何事情都会发生。您要确保所有字符都不是括号(打开或关闭)。这就是您所需要的:

array\(([^()]*)\)

替换为[]。当然,您必须进行多次传递,直到没有更多匹配为止。

我假设永远不会有任何不属于 array(...) 结构的括号;有了它,工作就变得复杂多了。

据我所知 python 正则表达式不支持括号嵌套,一般不建议将正则表达式用于该任务。 如果您不想编写程序,但在 ST 中执行,我会推荐其他方法。 Surround 包在更改周围的括号方面做得很好。你可以安装它然后:

  1. select所有数组开始
  2. 删除数组关键字
  3. 移到括号内
  4. 将周围的括号更改为大括号。为此,请按 ctrl+shift+p 并输入 Surround: change surround。在第一个输入字段中插入 ),在第二个输入字段中插入 ]。 (如果你插入[,它会在里面添加一个space。)

示范:

在 Sublime Text 中,您可以使用多个通道

\barray(\(((?>[^()]++|(?1))*)\))

并替换为 []

模式匹配:

  • \b - 前导词边界
  • array - 文字字符序列 array
  • (\(((?>[^()]++|(?1))*)\)) - 第 1 组匹配嵌套的成对括号和 捕获 成对括号之间的内容到第 2 组(这就是为什么你需要使用 在替换中)。