The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Регулярные выражения в Си"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Регулярные выражения в Си" 
Сообщение от Дима emailИскать по авторуВ закладки(??) on 04-Апр-05, 17:14  (MSK)
Здравствуйте.

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

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

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

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Регулярные выражения в Си" 
Сообщение от Дима emailИскать по авторуВ закладки(??) on 05-Апр-05, 17:09  (MSK)
Мужики, ну что? Никто не программил с регекспами на Си что ли?
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Регулярные выражения в Си" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 10-Апр-05, 20:49  (MSK)
>Мужики, ну что? Никто не программил с регекспами на Си что ли?
>


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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

Удачи, Дима.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

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


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру