Здравствуйте.Подскажите, в регулярных выражениях в Perl есть возможность использовать так называемый "ленивый" алгоритм поиска, то есть если мы ищем в строке "aaaaa" регулярное выражение /a+/, то мы получим "ааааа", если мы ищем /a+?/, то мы получим "a".
А как то же самое сделать на Си? Пишу с помощью regcomp() и regexec().
Заранее благодарен.
Дима.
Мужики, ну что? Никто не программил с регекспами на Си что ли?
>Мужики, ну что? Никто не программил с регекспами на Си что ли?
>
Ну я программил :). Я вообще перл не признаю :)Просто если
>Пишу с помощью regcomp() и regexec()то вопросов
> А как то же самое сделать на Си?
возникать не должно.Ну а если "Собираюсь использовать regcomp() и regexec()", тогда все что
вам нужно просто прочесть man. У меня это man 3 regex и man 7 regex
Откуда сразу ясно, что если:1) строка="aaaaa", pattern="a" (или "(a)" или [a]), то найдется "a"
2) строка="aaaaa", pattern="a+" (или (a+) или [a]+), то найдется "aaaaa"Пример:
#include <sys/types.h>
#include <regex.h>
#include <stdio.h>int match(const char *string, char *pattern, regmatch_t *reg) {
int status;
regex_t re;
size_t s;(!reg) ? (s=0) : (s=1);
if(regcomp(&re, pattern, REG_EXTENDED) != 0) return 0;
status = regexec(&re, string, s, reg, 0);
regfree(&re);
return !status;
}
void print_matched(char *s,char *p, regmatch_t reg) {
int i;
printf("Patern '%s' found in '%s', matched: '",p,s);
for (i=reg.rm_so; i<reg.rm_eo; i++) putchar(s[i]);
printf("', rest of string: '%s'\n",s+i);
putchar('\n');
}
int main() {
regmatch_t rg;
char str[]="aaaaa";
char ptr[]="a";
char ptr2[]="a+";if (match(str,ptr,&rg)) print_matched(str,ptr,rg);
if (match(str,ptr2,&rg)) print_matched(str,ptr2,rg);
}
>>Мужики, ну что? Никто не программил с регекспами на Си что ли?
>>
>
>
>Ну я программил :). Я вообще перл не признаю :)
>
>Просто если
>>Пишу с помощью regcomp() и regexec()
>
>то вопросов
>> А как то же самое сделать на Си?
>возникать не должно.
>
>Ну а если "Собираюсь использовать regcomp() и regexec()", тогда все что
>вам нужно просто прочесть man. У меня это man 3 regex и
> man 7 regex
>Откуда сразу ясно, что если:
>
>1) строка="aaaaa", pattern="a" (или "(a)" или [a]), то найдется "a"
это, само собой разумеется, понятно
>2) строка="aaaaa", pattern="a+" (или (a+) или [a]+), то найдется "aaaaa"
И это тоже
>
>Пример:
>
>#include <sys/types.h>
>#include <regex.h>
>#include <stdio.h>
>
>int match(const char *string, char *pattern, regmatch_t *reg) {
> int status;
> regex_t re;
> size_t s;
>
> (!reg) ? (s=0) : (s=1);
> if(regcomp(&re, pattern, REG_EXTENDED) != 0) return 0;
> status = regexec(&re, string, s, reg, 0);
> regfree(&re);
> return !status;
>}
>
>
>void print_matched(char *s,char *p, regmatch_t reg) {
> int i;
> printf("Patern '%s' found in '%s', matched: '",p,s);
> for (i=reg.rm_so; i<reg.rm_eo; i++) putchar(s[i]);
> printf("', rest of string: '%s'\n",s+i);
> putchar('\n');
>}
>
>
>int main() {
> regmatch_t rg;
> char str[]="aaaaa";
> char ptr[]="a";
> char ptr2[]="a+";
>
> if (match(str,ptr,&rg)) print_matched(str,ptr,rg);
> if (match(str,ptr2,&rg)) print_matched(str,ptr2,rg);
>}И это ясно как божий день.
А если у меня вот такой текст:
"abc
много всякой ерунды
cde
abc
много всякой ерунды
cde"Мне нужно найти текст
"abc
много всякой ерунды
cde"Я пишу регулярное выражение "abd.+cde", а оно мне выдает
"abc
много всякой ерунды
cde
abc
много всякой ерунды
cde"Алгоритм жадный. Если бы я мог написать как в перле "abd.+?cde", то он бы мне нашел то что мне надо.
Кстати, с библиотекой pcre - все работает на "УРА".
Удачи, Дима.
>А если у меня вот такой текст:
>
>"abc
>много всякой ерунды
>cde
>abc
>много всякой ерунды
>cde"
>
>Мне нужно найти текст
>"abc
>много всякой ерунды
>cde"
>
>Я пишу регулярное выражение "abd.+cde", а оно мне выдает
>"abc
>много всякой ерунды
>cde
>abc
>много всякой ерунды
>cde"
>
>Алгоритм жадный. Если бы я мог написать как в перле "abd.+?cde", то
>он бы мне нашел то что мне надо.
>Насколько я понял вам как раз таки и нужен "жадный" поиск, т.е. "хватающий" первое попавшееся совпадение, а он POSIX-ом насколько я знаю не поддерживается. В принципе в данном случае можно выкрутится, например, задав для поиска сначала abc, а потом в оставшейся строке cde, но это конечно не то.
>Кстати, с библиотекой pcre - все работает на "УРА".
>
Еще бы, на то она и Perl Compatible :)>Удачи, Дима.
Взаимно.P.S. Sorry что не сразу ответил - весна, в Инет даже заходить неохота, тем более что-то обсуждать :)
>Здравствуйте.
>
>Подскажите, в регулярных выражениях в Perl есть возможность использовать так называемый "ленивый"
>алгоритм поиска, то есть если мы ищем в строке "aaaaa" регулярное
>выражение /a+/, то мы получим "ааааа", если мы ищем /a+?/, то
>мы получим "a".
>
>А как то же самое сделать на Си? Пишу с помощью regcomp()
>и regexec().
>
>Заранее благодарен.
>Дима.Может имеет смысл использовать библиотеку pcre?
>>Здравствуйте.
>>
>>Подскажите, в регулярных выражениях в Perl есть возможность использовать так называемый "ленивый"
>>алгоритм поиска, то есть если мы ищем в строке "aaaaa" регулярное
>>выражение /a+/, то мы получим "ааааа", если мы ищем /a+?/, то
>>мы получим "a".
>>
>>А как то же самое сделать на Си? Пишу с помощью regcomp()
>>и regexec().
>>
>>Заранее благодарен.
>>Дима.
>
>Может имеет смысл использовать библиотеку pcre?Спасибо, поковыряю ее