Perl регулярное выражение получить строку с текстом в кавычках внутри кавычек - PullRequest
1 голос
/ 03 января 2012

Я пишу интерпретатор командной строки, но я не указал этот тип ввода:

command -text "hello this is "some text" with "quotes inside"" -other "another thing""" -another " -another "text"

Мне нужно выйти из кавычек и затем ввести строку в мой анализатор. Что я подумал:

/".+"/ но все берется из первой цитаты.

Есть ли у вас какие-либо идеи?

EDIT: Что я хочу:

ввод: command -text "hello this is "some text" with "quotes inside"" -other "another thing""" -another " -another "text"

вывод: command -text "hello this is \"some text\" with \"quotes inside\"" -other "another thing\"\"" -another " -another \"text"

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Вы идете по неверному пути, ИМО. Вам нужен определенный способ разграничения аргументов. Если вы хотите разрешить хаос в аргументах, вам нужно что-то еще, чтобы навести порядок.

Другими словами, вы можете использовать что-то вроде

-label1 [random characters] -nextlabel [random characters]

Но это все равно будет означать, что вы не можете использовать тире - в некоторых комбинациях, так как использование -text "some random -text" сломает его.

Мне кажется, что вы хотите надежное решение для компенсации пользователям, которые не знают, что они делают. Однако автоматизация приведет вас неправильно. Просто напишите синтаксический анализатор команд и выведите ошибку, если строки неправильно указаны в кавычках. Пусть пользователи корректируют свои данные, а не вы.

0 голосов
/ 03 января 2012

Что ж, у меня есть ОЧЕНЬ уродливое решение ... Он обрабатывает все, кроме черточек в строках.

Надеюсь, твои глаза не пострадают ...

fg@erwin ~ $ perl -ne 'my @l; foreach (split /-/) { my ($start, $middle, $end) = m/^([^"]+)"(.*)"([^"]*)$/ or do { push @l, $_; next; }; $middle =~ s/"/\\"/g;push @l, "$start\"$middle\"$end"; } END { print join("-", @l) . "\n";}' <<EOF
> command -text "hello this is "some text" with "quotes inside"" -other "another thing""" -another " -another "text"
> EOF
command -text "hello this is \"some text\" with \"quotes inside\"" -other "another thing\"\"" -another " -another "text"

Объясняя это немного ...

my @l;  # declare a new list l, which will contain the "transformed" strings
foreach (split /-/) {  # split against the dash -- no loop variable: $_ has the content
    # Try and capture in start, middle and end:
    # * start: from the beginning until the first quote;
    # * middle: everything but the last quote and whatever is after it;
    # * end: what is after the last quote
    # By default, m// applies to $_
    my ($start, $middle, $end) = m/^([^"]+)"(.*)"([^"]*)$/
        or do { # if no match...
            push @l, $_;  # put the line as is,
            next;         # and continue
        };
    $middle =~ s/"/\\"/g; # in the middle part, precede all quotes with a \
    push @l, "$start\"$middle\"$end"; # and push the final string onto the list
}

# finally, print all transformed lines joined with a dash, plus a newline
END { print join("-", @l) . "\n";}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...