2015-08-14 2 views
0

я пытаюсь извлечь строку в двойных кавычках в С. Например:'?' не работает в C Posix регулярных выражений

String[100] = "Hi,\"This is awesome\" and \"So is this\"" 

Мне нужно только, чтобы найти первый матч, «Это потрясающе». И это то, что я пробовал,

regcomp(&preg, "\"(.*?)\"", REG_EXTENDED); 
regexec(&preg, String, 2, regm, 0); 

где regm - массив совпадений.

Вместо "This is awesome", я получаю "This is awesome" and "So is this" как матч.

Не следует ли ? в (.*?) ограничить рег exp до нахождения первого матча?

+0

Вы можете разместить свой код более четко –

ответ

5

Нет. По-видимому, это .*? вещь, которую вы написали, предназначена для «не-жадного повторения» и получена из Perl или какого-либо другого языка (не уверен, какой). Это не имеет особого значения в POSIX ERE; ? просто избыточен. Вместо этого попробуйте правильную форму: "\"([^\"]*)\""

Спецификация POSIX ERE можно найти здесь:

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04

+0

Спасибо :) Можете ли вы указать мне на любую ссылку, которая объясняет возможности posix regex? Я не уверен, правильно ли я смотрю. Я пытаюсь найти эквивалент «отрицательного внешнего вида» в C posix reg exp, но пока не увенчался успехом. – skynet

+0

Добавлена ​​ссылка на спецификацию. –

+0

Обратите внимание, что POSIX ERE не имеет ничего похожего на утверждения look-behind или look-ahead и большинство других функций Perl-ish. Вы можете эмулировать некоторые из них, используя более длинное регулярное выражение с подвыражением в скобках для фактического захвата, но если вы обнаружите, что действительно хотите сделать Perl RE, может иметь смысл использовать библиотеку, которая обеспечивает Perl-совместимый RE. Первоначальная PCRE - плохая реализация (патологически плохая производительность на многих RE), но я считаю, что библиотека re2 Google обеспечивает хорошую реализацию PCRE. –

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