LINUX.ORG.RU

Как извлечь строку внутри кавычек, при этом не «запоминая» сами кавычки?

 ,


0

3

Правильный способ, который, к сожалению, «запоминает» кавычки и портит карму, когда нужно получить только содержимое внутри кавычек:

@l=$v=~m/(?<q>['"])(.*?)\g{q}/g;

Собственно, мне вообще нафиг не надо кавычки в @l, но фильтровать grep'ом - не совсем правильный вариант.

Можно ли как-то иначе это сделать?

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

Пока использовал вот это:

("[^"]*"|'[^']*'|[^'",]*)
Детский сад, конечно, но зато работает.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

В хеше ключ должен быть уникален ;)
Если массив не нужен можно вообще в теле цикла сразу обрабатывать значения.

Olegymous ★★★
()
Ответ на: комментарий от joy4eg

Не-а. В общем случае видов кавычек или символов, используемых в качестве кавычек, может быть довольно много. Почему именно двойные? Почему не одинарные? Почему не обратные? А если открывает строку двойная кавычка, а завершает - одинарная? Это ж криминал, это надо жалобы писать и сигналы посылать, куда следует. Здесь вам не тут.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

Экранирование - это всё-таки элемент недефолтного синтаксиса, имеющего отношение конкретно к языкам программирования.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

Можно попробовать более примитивный регексп:

Ну так я его и попробовал, см. выше. Мне нужно было конкретно zabbix-ключи разбирать, поэтому и так сошло.
У меня изначально строки вида:

item.key[value1,,"val,ue2", val ue 3, "va l ue4"]

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

Кстати, зачем тебе /g ?

У меня много строк, разделённых запятыми, в кавычках и без, нужно получить массив, состоящий из этих строк.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от Stil

Почему обязательно нужно переходить куда-то? Для задач автоматизации операций лучше подходит BASH, для работы с текстом - Perl.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Если правильно понял вопрос, то мб так?

my $a = "\'hello world\'";
print $a . "\n";
$a =~ s/^['"]//x;
$a =~ s/['"]$//x;
print $a . "\n";

break_in
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.