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

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

Восстановить пароль Регистрация
 
hromjo
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 82
14.08.2010, 21:51     Регулярные выражения #1
Помогите написать регулярку. Пишу на RE2.
Если в тексте встречается ******.moikrug.ru то нужно вытащить
то что под звездочками. Буду очень благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2010, 21:51     Регулярные выражения
Посмотрите здесь:

C++ регулярные выражения
[C++] Регулярные выражения C++
С++ и регулярные выражения C++
C++ Регулярные выражения в с++
C++ Регулярные выражения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.08.2010, 04:02     Регулярные выражения #2
Цитата Сообщение от hromjo Посмотреть сообщение
Пишу на RE2.
А что это?
Вот на С на всякий случай
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define BUFLEN 256
#define DELIM " \t\n"
#define TMPL ".moikrug.ru"
 
int main(void){
    char buf[BUFLEN], fnd[BUFLEN], * pBuf, * pFnd;
    
    while ( printf("\n> ") && fgets(buf, BUFLEN, stdin) ){
        if ( *buf == '\n' )
            break;
        for ( pBuf = strtok(buf, DELIM); pBuf; pBuf = strtok(NULL, DELIM) ){
            if ( pFnd = strstr(pBuf, TMPL) ){
                strncpy(fnd, pBuf, pFnd - pBuf);
                printf("%s\n", fnd);
            }
        }
    }
    exit(EXIT_SUCCESS);
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.08.2010, 05:15     Регулярные выражения #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstring>
#include <iostream>
 
using namespace std;
 
int main(int,char**){
  const char* origin = ".moikrug.ru";
  char str[] = "sfjlsdjflwer wer .moikrug.ru-sdfs fs";
  unsigned stat = 0, end_stat = strlen(origin), pos = 0, end = strlen(str);
  for( ; pos<end && stat!=end_stat; ++pos ){
    if( origin[stat] == str[pos] ){ 
      ++stat; 
    }else{
      stat = 0;
    }
  }
  if( stat == end_stat ){
    str[pos-end_stat] = 0;
    cout << str << endl;
  }
  return 0;
}
если интерпретировать это как конечный автомат, для распознавания регулярных выражений
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.08.2010, 06:11     Регулярные выражения #4
hromjo, я так понял, под звездочками может скрываться буквы или цифры:
Код
"(\\w+)\\.moikrug\\.ru"
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.08.2010, 06:33     Регулярные выражения #5
Пример на perl
Perl 6
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
 
while(<STDIN>)
{
    chomp;
    
    say (m/(\w+)\.moikrug\.ru/ ? "Captured string: '$1'" : "No capture");
}
Регулярные выражения
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.08.2010, 06:34     Регулярные выражения #6
круто, если говорить про перл, эта задача даже на вступление к регэкспам не тянет
Nameless One
15.08.2010, 06:36
  #7

Не по теме:

alex_x_x, ну да

hromjo
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 82
15.08.2010, 09:17  [ТС]     Регулярные выражения #8
alex_x_x, спс. Но наверно я задал вопрос не так.
Мне нужно вытащить логин, то есть:
http://*******.moikrug.ru.
Вот так.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.08.2010, 10:12     Регулярные выражения #9
Цитата Сообщение от hromjo Посмотреть сообщение
alex_x_x, спс. Но наверно я задал вопрос не так.
Мне нужно вытащить логин, то есть:
http://*******.moikrug.ru.
Вот так.
Тогда регулярное выражение для С должно иметь вид:
Код
"http://(\\w+)\\.moikrug\\.ru"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2010, 01:10     Регулярные выражения
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.08.2010, 01:10     Регулярные выражения #10
на си

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
#include <stdio.h>
#include <assert.h>
 
const char* origin = "http://.moikrug.ru", *str = "http http://http://hello.world.moikrug.ru.krug.moikrug.ru";
const unsigned BEGIN = 0, END_HTTP = 6, DOMEN = 7, END = 17;
 
void find_recurs( unsigned pos, unsigned state, unsigned start_dom, unsigned end_dom ){
  for( ; str[pos] ; ++pos ){
    if( BEGIN == state && origin[state] == str[pos] ){
      find_recurs( pos+1, BEGIN+1, 0, 0 );
    }else if( state>BEGIN && state<=END_HTTP ){
      if( origin[state] != str[pos] ){
        return;
      }else{
        if( END_HTTP == state++ ){ 
          start_dom = pos+1; 
        }
      }
    }else if( DOMEN == state && origin[state] == str[pos] ){
      find_recurs( pos+1, DOMEN+1, start_dom, pos );
    }else if( state>DOMEN && state <= END ){
      if( origin[state] != str[pos] ){
        return;
      }else{
        if( END == state++ ){ 
          assert( start_dom && end_dom && end_dom>start_dom );
          fwrite( str + start_dom, end_dom - start_dom, 1, stdout );
          putc( '\n', stdout );
          return;           
        }
      }      
    }
  }
}
 
 
int main(){
  find_recurs( 0, BEGIN, 0, 0 );
  return 0;
}
[alexxx@localhost ~]$ ./a.out
http://hello.world
http://hello.world.moikrug.ru.krug
hello.world
hello.world.moikrug.ru.krug

Добавлено через 51 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
#include <boost/regex.hpp>
#include <string>
#include <iostream>
 
int main(int argc, char* argv[]) 
{ 
        boost::regex e(".*http://(.*)\\.moikrug\\.ru.*",boost::regex::perl|boost::regex::icase); 
        std::string str = "hello world!!!dferwerer ewrewr [url]http://hell.is.here.moikrug.ru[/url] 23434"; 
        std::cout << regex_replace(str, e, "$1"); 
        return 0; 
}
можно так, но так неинтересно))
Yandex
Объявления
16.08.2010, 01:10     Регулярные выражения
Ответ Создать тему
Опции темы

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