URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4140
[ Назад ]

Исходное сообщение
"Регулярные выражения в Си"

Отправлено Дима , 04-Апр-05 17:14 
Здравствуйте.

Подскажите, в регулярных выражениях в Perl есть возможность использовать так называемый "ленивый" алгоритм поиска, то есть если мы ищем в строке "aaaaa" регулярное выражение /a+/, то мы получим "ааааа", если мы ищем /a+?/, то мы получим "a".

А как то же самое сделать на Си? Пишу с помощью regcomp() и regexec().

Заранее благодарен.
Дима.


Содержание

Сообщения в этом обсуждении
"Регулярные выражения в Си"
Отправлено Дима , 05-Апр-05 17:09 
Мужики, ну что? Никто не программил с регекспами на Си что ли?

"Регулярные выражения в Си"
Отправлено Soldier , 10-Апр-05 20:49 
>Мужики, ну что? Никто не программил с регекспами на Си что ли?
>


Ну я программил :). Я вообще перл не признаю :)

Просто если
>Пишу с помощью 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);
}


"Регулярные выражения в Си"
Отправлено Дима , 11-Апр-05 09:10 
>>Мужики, ну что? Никто не программил с регекспами на Си что ли?
>>
>
>
>Ну я программил :). Я вообще перл не признаю :)
>
>Просто если
>>Пишу с помощью 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 - все работает на "УРА".

Удачи, Дима.


"Регулярные выражения в Си"
Отправлено Soldier , 13-Апр-05 08:37 
>А если у меня вот такой текст:
>
>"abc
>много всякой ерунды
>cde
>abc
>много всякой ерунды
>cde"
>
>Мне нужно найти текст
>"abc
>много всякой ерунды
>cde"
>
>Я пишу регулярное выражение "abd.+cde", а оно мне выдает
>"abc
>много всякой ерунды
>cde
>abc
>много всякой ерунды
>cde"
>
>Алгоритм жадный. Если бы я мог написать как в перле "abd.+?cde", то
>он бы мне нашел то что мне надо.
>

Насколько я понял вам как раз таки и нужен "жадный" поиск, т.е. "хватающий" первое попавшееся совпадение, а он POSIX-ом  насколько я знаю не поддерживается. В принципе в данном случае можно выкрутится, например, задав для поиска сначала abc,  а потом  в оставшейся строке cde, но это конечно не то.

>Кстати, с библиотекой pcre - все работает на "УРА".
>
Еще бы, на то она и Perl Compatible :)

>Удачи, Дима.
Взаимно.

P.S. Sorry  что не сразу ответил - весна, в Инет даже заходить неохота, тем более что-то обсуждать :)



"Регулярные выражения в Си"
Отправлено tilde , 06-Апр-05 11:48 
>Здравствуйте.
>
>Подскажите, в регулярных выражениях в Perl есть возможность использовать так называемый "ленивый"
>алгоритм поиска, то есть если мы ищем в строке "aaaaa" регулярное
>выражение /a+/, то мы получим "ааааа", если мы ищем /a+?/, то
>мы получим "a".
>
>А как то же самое сделать на Си? Пишу с помощью regcomp()
>и regexec().
>
>Заранее благодарен.
>Дима.

Может имеет смысл использовать библиотеку pcre?


"Регулярные выражения в Си"
Отправлено Дима , 06-Апр-05 14:18 
>>Здравствуйте.
>>
>>Подскажите, в регулярных выражениях в Perl есть возможность использовать так называемый "ленивый"
>>алгоритм поиска, то есть если мы ищем в строке "aaaaa" регулярное
>>выражение /a+/, то мы получим "ааааа", если мы ищем /a+?/, то
>>мы получим "a".
>>
>>А как то же самое сделать на Си? Пишу с помощью regcomp()
>>и regexec().
>>
>>Заранее благодарен.
>>Дима.
>
>Может имеет смысл использовать библиотеку pcre?

Спасибо, поковыряю ее