Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

14.08.2010, 21:51. Просмотров 1089. Ответов 9
Метки нет (Все метки)

Помогите написать регулярку. Пишу на RE2.
Если в тексте встречается ******.moikrug.ru то нужно вытащить
то что под звездочками. Буду очень благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2010, 21:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Регулярные выражения (C++):

Регулярные выражения в с++ - C++
Рылся рылся, нигде не нашел... Кто нибудь, объясните: 1) как установить эту библиотеку Regex. 2) Как заставить её работать. 3) И...

Регулярные выражения с++11 - C++
Просветите, пожалуйста, как из следующей строки "123<tag>456</tag>789<tag>987</tag>654321" с помощью регулярного выражения напечатать "456...

Регулярные выражения - C++
Доброй ночи! Использую вот такой код void INITDIALOG(void* p){ char* bufer = new char; server.GetLocList(bufer); char * t =...

Регулярные выражения с++ - C++
Пользователь должен ввести строки: фамилию(первая буква должна быть заглавной), дату рождения(по форме аа.аа.аааа), состояние здоровья(good...

регулярные выражения - C++
прочитал статю http://www.opennet.ru/base/dev/pcre_cpp.txt.html про регулярные выражения в c++ неужели там мноо кода нужно писать? ...

[C++] Регулярные выражения - C++
Знаю что в стандарте С нет регулярных выражений. Хочу попробывать собрать простую функцию поиска по шаблону регулярных выражений. ...

9
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,850
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);
}
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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;
}
если интерпретировать это как конечный автомат, для распознавания регулярных выражений
2
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
15.08.2010, 06:11 #4
hromjo, я так понял, под звездочками может скрываться буквы или цифры:
Код
"(\\w+)\\.moikrug\\.ru"
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
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");
}
Регулярные выражения
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
15.08.2010, 06:34 #6
круто, если говорить про перл, эта задача даже на вступление к регэкспам не тянет
0
Nameless One
15.08.2010, 06:36
  #7

Не по теме:

alex_x_x, ну да

0
hromjo
1 / 1 / 0
Регистрация: 04.04.2010
Сообщений: 82
15.08.2010, 09:17  [ТС] #8
alex_x_x, спс. Но наверно я задал вопрос не так.
Мне нужно вытащить логин, то есть:
.
Вот так.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
15.08.2010, 10:12 #9
Цитата Сообщение от hromjo Посмотреть сообщение
alex_x_x, спс. Но наверно я задал вопрос не так.
Мне нужно вытащить логин, то есть:
.
Вот так.
Тогда регулярное выражение для С должно иметь вид:
Код
"http://(\\w+)\\.moikrug\\.ru"
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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; 
}
можно так, но так неинтересно))
1
16.08.2010, 01:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2010, 01:10
Привет! Вот еще темы с ответами:

Регулярные выражения - C++
Привет помогите составить регулярное выражение, чтобы парсить такую строку: , , результатом должно быть: a hello world any ...

Регулярные выражения - C++
Ребят, у меня тут проблемы. В файле input.txt есть строчки, в которых нужно найти вес, т.е., например, 221 kg, 45g и отправить их в аутпут....

Регулярные выражения - C++
Составить регулярное выражение, пропускающее строки, содержащие хотя бы по разу каждую из трех первых букв вашей фамилии(Например, фамилия...

Регулярные выражения - C++
Всем доброе утро. Ребята подскажите что не так в выражении вот шаблон регулярного выражения ^*,&quot;(*)&quot;,&quot;(*)&quot; а срочку которую отправляю...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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