Еще один вопрос 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',
]]);
Кто-нибудь? Спасибо!
В Sublime Text вы можете использовать несколько проходов с
\barray(\(((?>[^()]++|(?1))*)\))
и заменить на [$2]
,
Шаблон соответствует:
\b
— ведущая граница словаarray
— буквенная последовательность символов array
(\(((?>[^()]++|(?1))*)\))
— Группа 1 соответствует вложенным, парным скобкам и отлов содержимое между парными скобками в группу 2 (поэтому вам нужно сослаться на группу 2 с помощью $2
в замену).Насколько я знаю, регулярное выражение Python не поддерживает вложение скобок и регулярное выражение вообще не рекомендуется для этих задач.
Если вы не хотите писать программу, но делаете это на ST, я бы порекомендовал и другой подход. окружать пакет делает хорошую работу по изменению окружающих скобок. Вы можете установить его тогда:
ctrl+shift+p
и писать Surround: change surround
, Вставить )
в первом поле ввода и ]
во втором поле ввода. (Если вы вставите [
это добавит дополнительное пространство внутри.)демонстрация:
У этого регулярного выражения не должно быть проблем с сопоставлением границ строк, но это неверно. [^\(].*?
гарантирует, что первый символ после открывающей скобки не станет еще одним открытым пареном, но после этого все идет. Вы хотите убедиться, что все символы не являются круглыми скобками (открыты или закрыты). Это все, что вам нужно:
array\(([^()]*)\)
Заменить [$1]
, Конечно, вам придется сделать несколько проходов, пока больше не будет совпадений.
Я предполагаю, что никогда не будет скобок, которые не являются частью array(...)
состав; если есть, работа становится намного сложнее.