【问题标题】:Regex change "array()" to "[]" in Sublime 3正则表达式在 Sublime 3 中将“array()”更改为“[]”
【发布时间】:2026-01-02 08:00:01
【问题描述】:

又一个正则表达式问题。 我有许多 PHP 文件要从 array('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\()(.*)?\)
  • Matei Mihai,请不要问我 =) 这不是我的决定,我们正在将旧项目更新为新框架,因此我们正在更改数组定义。
  • @lime 你给出的例子没有array()s 和,,只有=>。你也想将array('foo' => 'bar') 更改为['foo', 'bar'] 吗?
  • 或者你可以在Sublime Text中使用array(\(((?>[^()]++|(?1))*)\))的多个pass并用[$2]替换

标签: php regex sublimetext3 sublimetext


【解决方案1】:

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

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

并替换为[$2]

模式匹配:

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

【讨论】:

  • 我会在我的桌面上添加演示和截图。很高兴为您提供帮助。
  • 我的时间还不够,但我会补充我所承诺的。
  • 工作正常,但不要忘记重复,直到所有嵌套的 array() 调用都被替换。
【解决方案2】:

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

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

演示:

【讨论】:

  • S&R 使用的是 Boost 正则表达式,而不是 Python。它支持递归。
  • 这真是太好了!我也可能会使用它。谢谢!
【解决方案3】:

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

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

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

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

【讨论】:

  • 这不起作用。是的,在定义内部和外部有很多括号不是 array(...) 的一部分。
  • 好的,那么我们需要一个更完整的例子。