Регулярное выражение для избежания двойных кавычек внутри одинарных кавычек - PullRequest
1 голос
/ 27 октября 2010

Мне нужно регулярное выражение, которое экранирует или захватывает (если еще не экранировано) ALL символы двойных кавычек INSIDE строка в одинарных кавычках, а затем преобразует открывающие одинарные кавычки в двойныекавычки!

Мы выполняем рефакторинг файлов, которые содержат много (и я имею в виду много!) строк в одинарных кавычках как в PHP, так и в JS-файлах.Единственное, что у них общего, - это то, что строки, по крайней мере, в одну строку и заключаются в = на обоих языках.

Я привожу пример ( пример - уродливый устаревший код, так что не судите егопожалуйста, я уже сделал это :)) У нас есть файл, который начинается так:

var baseUrl = $("#baseurl").html();
var head = '<div id="finishingDiv" style="background-image:url({baseUrl}css/userAd/images/out_main.jpg); background-repeat: repeat-y; ">'+
'<div id="buttonbar" style="width:810px; text-align:right">';

, и я хочу, чтобы он выглядел так:

var baseUrl = $("#baseurl").html();
var head = "<div id=\"finishingDiv\" style=\"background-image:url({baseUrl}css/userAd/images/out_main.jpg); background-repeat: repeat-y; \">" +
"<div id=\"buttonbar\" style=\"width:810px; text-align:right\">";

Как высм. правильные строки в двойных кавычках не затрагиваются.

Итак, мой основной вопрос: как мне захватить все символы одного вида (в моем случае это символ ") между определенным начальным и конечным символом (в моем случаеперсонаж ').

Это регулярное выражение '.*(").*' или '[^']*(")[^']*' просто захватывает всегда один "для меня за матч.Если, если нужно более одного шага, это тоже нормально, это должно сработать.Я был бы рад любому решению, специфичному для IDE, специфическому для языка или оболочки, которое действительно работает.

Пожалуйста, помогите, я в отчаянии, большое спасибо

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Самой большой проблемой будет выяснение того, где находятся все строки, поскольку вы не можете проанализировать все JS или PHP с помощью регулярного выражения. Однако, если я предполагаю, что вас не волнуют комментарии, этот код Ruby будет перехватывать большинство случаев (но вы должны просмотреть его вывод):

#!/usr/bin/ruby -p

gsub!(/'((?:[^\\']|\\[\\'])+)'/) do |m|
  %Q{"#{$1.gsub("\\'","'").gsub(/\\[^\\]/) { "\\#{$0}" }.gsub('"','\\"')}"}
end

Этот код принимает все, что представлено в stdin / содержимом аргументов файла, находит строку в одинарных кавычках (с учетом возможного присутствия \\ и \'), а затем, для его замены, запускает ряд замен внутри подобранной строки (очистка обратной косой черты и т. д.). Результат выводится на стандартный вывод. Если вы хотите более автоматизированный подход, замените первую строку на #!/usr/bin/ruby -pi.bak; затем, независимо от того, какие аргументы файла представлены, выполняется подстановка на месте . Старые файлы хранятся с дополнительным расширением .bak.

Чтобы запустить этот код, если вы раньше не использовали Ruby: сохраните его как угодно, например, fix-sq.rb; пробег chmod +x fix-sq.rb; и затем запустите ./fix-sq.rb file1 file2 file3.

0 голосов
/ 27 октября 2010

Это регулярное выражение захватывает только одно ", потому что вы запрашиваете только одно. Если вы хотите захватить все кавычки, вам нужно что-то более похожее на (".*)+ в середине. Это говорит:" Захватите один или несколько из этого шаблона : двойная кавычка, за которой следует ноль или более любых символов. "

...