Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tuborg12
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 4
#1

Регулярные выражения. - C++

14.02.2011, 10:13. Просмотров 1143. Ответов 8
Метки нет (Все метки)

Здравствуйте всем!
Имеется массив строк.
Надо написать программу с функцией реализующей выявления соответствия между шаблоном допустим шаблон-aaa* и строкой aaab.
т.к шаблон aaa* соответствует aaab то соответсвие выявлено.
В шаблоне можно задавать спец. символы:
* - заменяет любую последовательность символов, в том числе и пустую
? - заменять любой символ
т.е.
"aaab" and "*b" = 1
"aaab" and "aaa*" = 1
"aaab" and "*" = 1
"aaab" and "aaa?" = 1
"aaab" and "aaab*" = 1
"aaab" and "a?ab" = 1
"aaab" abd "a*b" = 1
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
14.02.2011, 10:23     Регулярные выражения. #2
А при чем здесь регулярные выражения?
tuborg12
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 4
14.02.2011, 10:30  [ТС]     Регулярные выражения. #3
Цитата Сообщение от Nameless One Посмотреть сообщение
А при чем здесь регулярные выражения?
Ну принцип вроде такой же как в регулярных выражениях.
Или я ошибаюсь?
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
14.02.2011, 10:37     Регулярные выражения. #4
tuborg12, что ты понимаешь под "принципом"? А то, что ты написал, называется globbing pattern matching. Подробности можно прочитать на той же википедии.
tuborg12
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 4
14.02.2011, 10:48  [ТС]     Регулярные выражения. #5
Цитата Сообщение от Nameless One Посмотреть сообщение
tuborg12, что ты понимаешь под "принципом"? А то, что ты написал, называется globbing pattern matching. Подробности можно прочитать на той же википедии.
Не нашел.Если не трудно кинь ссылку пожайлуста и если есть то на русском.
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
14.02.2011, 10:51     Регулярные выражения. #6
Вот описание: http://en.wikipedia.org/wiki/Glob_(programming)
А здесь есть пример реализации: http://groups.google.com/group/comp....1cb189cfff7b6f
tuborg12
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 4
14.02.2011, 11:20  [ТС]     Регулярные выражения. #7
кто-то вообще делал подобную программу?
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
14.02.2011, 11:38     Регулярные выражения. #8
Ну неужели так трудно взять код по ссылке, которую я привел, и переделать под себя? Держи:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
 
#define TRUE 1
#define FALSE 0
#define ABORT -1
 
int star(const char* text, const char* pattern);
int doMatch(const char* text, const char* pattern);
 
int main(int argc, char* argv[])
{
    if(argc != 3)
    fprintf(stderr, "Usage: %s PATTERN TEXT\n", *argv),
        exit(1);
 
    printf("Text `%s' matched pattern `%s': %s\n",
       argv[2], argv[1],
       doMatch(argv[2], argv[1]) == TRUE ?
       "yes" : "no");
    
    exit(0);
}
 
int star(const char* text, const char* pattern)
{
    int ret;
 
    do
    ret = doMatch(text++, pattern);
    while(ret == FALSE);
    return ret;
}
 
int doMatch(const char* text, const char* pattern)
{
    for( ; *pattern; ++text, ++pattern)
    {
    if(*text == '\0' && *pattern != '*')
        return ABORT;
    switch(*pattern)
    {
    case '?':
        continue;
 
    case '*':
        return *++pattern ? star(text, pattern) : TRUE;
 
    default:
        if(*text != *pattern)
        return FALSE;
        continue;
    }
    }
    return *text == '\0';
}
Программа принимает два аргумента - шаблон и текст, который будет сопоставляться с шаблоном
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2011, 14:46     Регулярные выражения.
Еще ссылки по теме:

C++ Регулярные выражения
C++ Регулярные выражения
C++ Регулярные выражения
C++ Регулярные выражения
C++ Регулярные выражения с++11

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.02.2011, 14:46     Регулярные выражения. #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/////////////////////////////////////////////////////////////////////////////////////////
//Имеется массив строк.
//Надо написать программу с функцией реализующей выявления соответствия между шаблоном 
//допустим шаблон-aaa* и строкой aaab.
//т.к шаблон aaa* соответствует aaab то соответсвие выявлено.
//В шаблоне можно задавать спец. символы:
//* - заменяет любую последовательность символов, в том числе и пустую
//? - заменять любой символ
//т.е.
//"aaab" and "*b"     = 1
//"aaab" and "aaa*"   = 1
//"aaab" and "*"      = 1
//"aaab" and "aaa?"   = 1
//"aaab" and "aaab*"  = 1
//"aaab" and "a?ab"   = 1
//"aaab" abd "a*b"    = 1
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
bool  do_match(const T_str&  text, const T_str&  pattern)
{   
    if(pattern.empty())
    {
        return  text.empty();
    }
 
    if(pattern[0] == '*')
    {
        for(T_str  new_text = text; ; new_text.erase(0, 1))
        {
            if(do_match(new_text, pattern.substr(1)))
            {
                return  true;
            }
 
            if(new_text.empty())
            {                
                return  false;        
            }
        }    
    }
 
    return    !text.empty()
           && (pattern[0] == '?' || pattern[0] == text[0])
           && do_match(text.substr(1), pattern.substr(1));
}
/////////////////////////////////////////////////////////////////////////////////////////
void  try_text(const T_str&  text, const T_str&  pattern)
{
    std::cout << '\"'
              << text
              << '\"'
              << '\t'
              << '\"'
              << pattern
              << '\"'
              << '\t'
              << (do_match(text, pattern) ? "да" : "нет")
              << std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    
    try_text("aaab",  "*b"    );
    try_text("aaab",  "aaa*"  );
    try_text("aaab",  "*"     );
    try_text("aaab",  "aaa?"  );
    try_text("aaab",  "aaab*" );
    try_text("aaab",  "a?ab"  );
    try_text("aaab",  "a*b"   );
 
    std::cout << "================================================================="
              << std::endl;
 
    try_text("ab",    "a?b"   );    
}
Yandex
Объявления
14.02.2011, 14:46     Регулярные выражения.
Ответ Создать тему
Опции темы

Текущее время: 19:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru