[Решено] Есть ли утверждения в регулярных выражениях на си?

Модератор: Модераторы разделов

Ответить
DetL0k
Сообщения: 11

[Решено] Есть ли утверждения в регулярных выражениях на си?

Сообщение DetL0k »

Привет. Я пишу на си под линукс. Задача: распарсить строку так чтобы получить либо целое слово либо несколько слов, при условии что они заключены в кавычки (но сами кавычки в выборку не должны попадать). Типо как в bash, когда указывается путь с пробелами.

Для регулярных выражений использую вот эту библиотеку.
Обычно для таких целей я использую утверждения, но на си они почему-то не компилируются :unsure:

Такой код компилируется нормально, но в выборку попадают кавычки:

Код: Выделить всё

if(regcomp(&argsmask, "[a-zA-Z0-9\\.\\-\\_]+|\"[^\"]*(\"|$)", REG_EXTENDED) != 0)
{
    printf("Error\n");
    return -1;
}

А вот так получаю Error:

Код: Выделить всё

if(regcomp(&argsmask, "[a-zA-Z0-9\\.\\-\\_]+|(?<=\")[^\"]*(\"|$)", REG_EXTENDED) != 0)
{
    printf("Error\n");
    return -1;
}


Докумментация маленькая, там ответа не нашел. В гугле тоже. Есть мысли? Может тут синтаксис другой?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: [Решено] Есть ли утверждения в регулярных выражениях на си?

Сообщение serzh-z »

На первый взгляд - как минимум нужно добавить `\\` перед `\"`.
Спасибо сказали:
DetL0k
Сообщения: 11

Re: [Решено] Есть ли утверждения в регулярных выражениях на си?

Сообщение DetL0k »

Не, тут все правильно. Слэш я добавил чтобы экранировать кавычку. Если я сделаю \\" то целостность строки будет нарушена и код вообще не скомпилируется.

А \\\" не подходит
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Решено] Есть ли утверждения в регулярных выражениях на си?

Сообщение Bizdelnick »

DetL0k писал(а):
26.09.2016 15:02

Код: Выделить всё

"[a-zA-Z0-9\\.\\-\\_]+|\"[^\"]*(\"|$)"

Экранировать точку внутри класса символов не нужно. Подчёркивание тем более. Дефис можно поставить последним перед ']', тогда и его экранировать не потребуется.

По теме — Вам нужен захват подвыражения, примерно так:

Код: Выделить всё

"([a-zA-Z0-9._-]+)|\"([^\"]*)(\"|$)"

Требующаяся Вам подстрока будет в pmatch[1].
Ну а если непременно хотите использовать lookaround'ы, то Вам нужна pcre. Но вариант с lookaround'ами будет хуже по производительности.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
DetL0k
Сообщения: 11

Re: [Решено] Есть ли утверждения в регулярных выражениях на си?

Сообщение DetL0k »

Разобрался с подвыражениями. Спасибо, это то что надо.
Спасибо сказали:
Ответить