2016-12-29 6 views
4

Я пытаюсь добиться следующего без какого-либо успеха:регулярные выражения с зсапом в C

Отсоединения отверстия

сообщения "

и задней

"

, оставляя содержимое в промежутке и сохраняя его в моей переменной, используя регулярные выражения sscanf. Я написал следующий код:

sscanf(buffer, "message \"%[^\"]", message) 

Который работает хорошо, когда у меня есть что-то подобное сообщение «Привет», но когда я пытаюсь следующую строку, я получаю только белое пространство между двумя цитате Метки.

сообщение «„“» это тест «» «„

В результате этого должна быть „““это тест„“»

Есть ли способ обновить мое выражение, чтобы оно включало это экстремальное событие сообщения? Я попытался найти его как в google, так и здесь, и не смог найти элегантный ответ. Я знаю, что с помощью строковых манипуляций можно использовать много строк кода, но я пытаюсь сделать что-то более простое здесь.

P.S. Волочить "конец выражения, и является обязательным в программе, после этого ничего не приходит.

Заранее спасибо за отзыв!

+0

будет ли что-нибудь после окончания '' '? – Fallenhero

+0

если нет, вы можете использовать '. 'вместо' [^ \ "]' – Fallenhero

+0

Нет, конечный "- это конец всего выражения. – BoazKG

ответ

2

Если вы хорошо с не использованием регулярных выражений для Все это:

Оригинальная версия:

sscanf(buffer, "message \"%[^$]", message); // remove 'message "' 
message[strlen(message) - 1] = '\0'; // remove trailing '"' 

Safe, правильно, и общая версия:

char* buffer = ...; 
const char* prefix = "message \""; 
const char* suffix = "\""; 

if (strstr(buffer, prefix) != buffer) { 
    // error, doesn't start with `prefix` 
} 

buffer += strlen(prefix); 

char* suffixStart = strrchr(buffer, suffix[0]); 
if (!suffixStart || strcmp(suffixStart, suffix) != 0) { 
    // error, doesn't end with `suffix` 
} 

*suffixStart = '\0'; // strip `suffix` 
+3

Этот код имеет переполнение буфера, если сообщение недостаточно велико и неопределенное поведение, если strlen (message) == 0 и, вероятно, если сообщение не было прочитано вообще. –

+4

Символы в наборе сканирования на самом деле не являются регулярным выражением. Показанный формат не будет анализировать «сообщение», чтобы отправить $ 20 сразу «правильно»; он остановится на символе $. –

+0

@WernerHenze Исправлено. – emlai

 Смежные вопросы

  • Нет связанных вопросов^_^