Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Вопросы начинающих программистов
Перезагрузить страницу Составление регулярных выражений в С++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_Actor imported_Actor вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.05.2009
По умолчанию Составление регулярных выражений в С++ - 17.11.2009, 17:53

Затрудняюсь составить регулярное выражение для такой задачи. К примеру есть некое слово "корректные" и большая куча всяких символов, необходимо выбрать из этой кучи такую последовательность в которую бы можно было описать что это слово корректные, ну к примеру куча такая "йцуй01223145673фы". Сделал такую регулярку: (.).(.){2}(.)\1.{3}\3 но она не выполняет поставленную задачу.
Ответить с цитированием
  (#2 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 17.11.2009, 18:04

Честно скажу, три раза прочёл задание и не понял, чего надо...
Ответить с цитированием
  (#3 (permalink)) Старый
imported_Actor imported_Actor вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.05.2009
По умолчанию 18.11.2009, 04:34

Ну вот в примере выше я привел пример где в куче зашифрованно слово "корректные" собстно нужно сделать регулярку для поиска в этой куче цифр
Ответить с цитированием
  (#4 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 18.11.2009, 11:13

Нифига не понятно. Просто выбрать цифры или расшифровать ?
Ответить с цитированием
  (#5 (permalink)) Старый
imported_Actor imported_Actor вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.05.2009
По умолчанию 20.11.2009, 04:34

Да нет же, ладно обобщим задачу. Нужно сделать поиск слов в куче по маске... Маска регулярное выражение. Вроде бы все просто привел пример...
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 20.11.2009, 12:49

Из кучи "йцуй01223145673фы" нельзя составить слово "корректные". Только буква "ы" есть в куче.
Ответить с цитированием
  (#7 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 20.11.2009, 12:58

Имеется в виду, что регулярному выражению должно соответствовать 01223145673.
Тому, что Actor написал в самом начале, оно соответствует. Но, видимо, надо чтобы с разными символами все было в порядке. Т.е. тому выражению, что написано, будет соответствовать и 11111111111, а надо, насколько я понимаю, чтобы не соответствовало.
Ответить с цитированием
  (#8 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 20.11.2009, 13:03

Там один символ лишний, должно быть 0122314563.
Ответить с цитированием
  (#9 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 20.11.2009, 14:31

Интересная задача. :-)

Если нужно искать конкретно для слова "корректные", то можно сделать так - везде поставить группы, а потом полученные соответствия проверить на уникальность. Например, на Visual Prolog 7.x:
Код:
run():- 
    Str = "фывапр0122304563эждло",
    RE = @"(.)(.)(.){2}(.)\1(.)(.)(.)\4",   % корректные
    R = regExp::new(RE, true),
    R:match(Str, X, Y, G), G = [Match | L], uniq(L),
    write(X," - ", Y, " - ", Match, " - ", L), 
    fail;
    _ = readLine().
Здесь получится:
Код:
6 - 10 - 0122304563 - ["0","1","2","3","4","5","6"]
Есть большой недостаток: если первое соответствие шаблону будет неправильным, то все будет плохо.
Придется искать заново в другой части строки.

Аналогично, шаблон такой можно построить программно для любого слова, не только "корректные" (в Visual Prolog это легко сделать), но там возникнет такая же проблема.

Я не знаю, как с регулярными выражениями в других языках дело обстоит, может, проще все.
Ответить с цитированием
  (#10 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 20.11.2009, 14:51

В общем, на Visual Prolog 7.x можно сделать так:
Код:
class predicates
make: (string) -> string.
make: (charCount, string, tuple{char, charCount}*, string) -> string.
find : (string, string) -> string determ.
find1 : (string, string) -> string determ.
uniq: (A*) determ.
clauses
make(Str) = make(1, Str, [], "").

make(N, Str, Corr, Acc) = make(N1, Str1, Corr1, Acc1):- 
    frontChar(Str, Ch, Str1),
    !,
    if tuple(Ch, C) = getMember_nd(Corr), ! then
        Acc1 = concat(Acc, "\\", toString(C)), Corr1 = Corr, N1 = N
    else     
        Acc1 = concat(Acc, "(.)"), Corr1 = [tuple(Ch, N) | Corr], N1 = N + 1
    end if.
make(_, _, _, R) = R.

find(Str, Mask) = find1(Str, make(Mask)).

find1(Str, RE) = Match:-     
    REOb = regExp::new(RE, true),
    REOb:match(Str, Pos, _, G), 
    G = [Match1 | L], 
    if uniq(L) then
        Match = Match1
    else 
        front(Str, Pos + 1, _, Str1), 
        Match = find1(Str1, RE)
    end if.

uniq([A | L]):- isMember(A, L), !, fail; uniq(L).
uniq([]).

run():-      
    Str = "фы111111111111вапр0122304563эждло",
    Match = find(Str, "корректные"),
    writef("Match = %", Match), 
    fail;
   _ = readLine().
Находит то, что нужно:

Match = 0122304563

Можно и позиции посчитать. И вообще наверное можно проще. :-)
Ответить с цитированием
  (#11 (permalink)) Старый
imported_Actor imported_Actor вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.05.2009
По умолчанию 20.11.2009, 16:50

Наконец то поняли мою задачу =)
Вот только к сожалению пролог не та парадигма которую я выбрал. Есть примеры на ооп или императивный стиль? (делфи, си)
Ответить с цитированием
  (#12 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 20.11.2009, 16:58

Тут и так все императивно, только синтаксис VIP. Так что можно просто переписать код.
Но на других языках могут быть и другие возможности. Правда, я их не знаю, на "императивных" не пишу. :-)

Ответить с цитированием
Ads
  (#13 (permalink)) Старый
imported_Actor imported_Actor вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.05.2009
По умолчанию 21.11.2009, 10:23

да не совсем ясно (
Ответить с цитированием
  (#14 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 22.11.2009, 16:29

По смыслу, как строится маска.
В Corr хранятся пары <символ - номер группы символа>, в Acc строится маска, N - это счетчик.
Отрывается очередной символ от слова (например, "корректные").
Если ему уже был сопоставлен номер группы, здесь, C, то к Acc добавляется строка "\С".
Иначе, к Acc добавляется строка "(.)", а в Corr запоминается новая пара <символ - N>, счетчик увеличивается на 1, и т.д.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение системы регулярных уравнений ABBA@12 Вопросы начинающих программистов 6 05.09.2011 18:09
Составление томов на HDD Веталь Любые вопросы от новичков 2 05.07.2011 05:24
Использование регулярных вырожений AndOr Perl 0 21.02.2011 13:07
Составление графики в С++ SimTiko Вопросы начинающих программистов 7 08.02.2010 09:18
Поиск произвольной подстроки в строке с помощью регулярных выражений Barbastro Visual C++ 2 27.12.2009 00:00
Составление расписания Маринчик Prolog 1 15.11.2009 22:03
Составление списка ресурсов zevun Haskell 4 28.05.2009 06:51
Составление программы для вычисления выражений в С++ tosik Вопросы начинающих программистов 45 08.01.2008 02:45
Калькулятор выражений Винитарх Prolog 5 25.04.2007 22:37
Составление расписаний. Roman_Pro Prolog 3 12.12.2005 19:17
DLL и Анализатор выражений Elph C++ Builder 5 28.10.2005 08:32
Создание sql-выражений vilru Oracle 3 14.06.2005 12:45



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов