Forum Webscript.Ru

Программирование => Регулярные выражения => Тема начата: xmolex от 13 Февраля 2008, 13:04:42

Название: `name`=\'value\', `name2` = \'value , \\\' value\'
Отправлено: xmolex от 13 Февраля 2008, 13:04:42
Здравствуйте. Прошу помочь с написанием правильного выражения. Пишу на Perl, но думаю, что правильнее задать вопрос в этом разделе.
Имеется строка:
`name`=\'value\',  `name2`   =    \'value , \\\'  value\'
Как я могу вырезать все пробелы, кроме тех которые заключены между ` или \' Перепробовал уже массу вариантов, но находятся случаи, при которых работа будет выполнена не верно. Очень надеюсь на помощь.
Название: `name`=\'value\', `name2` = \'value , \\\' value\'
Отправлено: ravshaniy от 14 Февраля 2008, 10:44:06
можно ли попросить вас уточнить задачу. Набор исходных строк и какой должен быть результат?
Название: `name`=\'value\', `name2` = \'value , \\\' value\'
Отправлено: xmolex от 14 Февраля 2008, 12:39:41
$text = qq|`name`=\'value\',  `name2`   =    \'value , \\\'  value\'|; # исходная строка
После некоторых действий должно получиться
$text = qq|`name`=\'value\',`name2`=\'value , \\\'  value\'|; # результат

Там где значение name2 по середине должна быть экранированная кавычка, но форум не дает это изобразить. Вообщем `name2`=\'value , \\ \'  value\', без пробела только между слешем и одинарной кавычкой. Надеюсь не запутал вас.
Название: `name`=\'value\', `name2` = \'value , \\\' value\'
Отправлено: ravshaniy от 14 Февраля 2008, 18:15:02
my $text = q|`name`=\'value\',  `name2`   =    \'value , \\\\\'  value\'|;
$text =~ s/=\\s+\'/=\'/g;
$text =~ s/`\\s+=/`=/g;
$text =~ s/,\\s+`/,`/g;
print $text;

подойдет?
Название: `name`=\'value\', `name2` = \'value , \\\' value\'
Отправлено: xmolex от 14 Февраля 2008, 19:15:50
Конкретно под этот пример бы подошло, но проблема в том, что заранее я не знаю значений. А если в качестве значения передадут текст:
    =     , тогда первое же выражение нарушит его.
Я имею ввиду, что может быть такая конструкция:

my $text = q|`name`=\'value\',  `name2`   =    \'value , \\ \'  =     value\'|;
my $text = q|`name`=\'value\',  `name2`   =    \'value , \\ \'  ,,,   =    ,,,   `````value\'|;
my $text = q|`name`=\'value\',  `name2`   =    \'value , \\ \'  value\'|;

Как видите после символа "=" мы встречаем окрывающую и закрывающую одинарную кавычку. Так вот между этими кавычками может быть все что угодно, даже символ одинарной кавычки, но он должен быть экранирован. Нужно просто убрать все пробелы, кроме тех которые являются значениями, т.к. значением может быть текст, а текст должен оставаться неизменным.
Название: `name`=\'value\', `name2` = \'value , \\\' value\'
Отправлено: andymc от 14 Февраля 2008, 23:02:55
Предлагаю сначала заменить все куски текста в кавычках на какой-то набор символов например $$$xxx1, $$$xxx2 и т.д., потом удалить пробелы и произвести обратную замену наборов символов на куски текста.
С помощью одних регулярных выражений это будет сложно.
Название: `name`=\'value\', `name2` = \'value , \\\' value\'
Отправлено: xmolex от 22 Февраля 2008, 11:53:37
Вообщем, решил отказаться от регулярных выражений в этом случае. Решил обрабатывать посимвольно строку. Если кому интересно, то http://forums.webscript.ru/showthread.php?s=&threadid=26519, но там уже perl.