Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::regex, искать совпадения только с начала, искать только с первого символа 
V
    Опции темы
rudvil
Дата 11.7.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



В доках так и не смог найти необходимый мне флаг, возможно так нужно несколько использовать... пока ещё не разобрался.
Нужно искать совпадение начиная с первого символа, повторюсь именно с первого.
Пока-что нашел только такой выход
Код
#include <iostream>
#include <string>

#include <boost/regex.hpp>

int main(int argc, char* argv[]) {
  boost::regex expr;
  try {
    expr = "\\d+\\.\\d+|\\d+";
  } catch (boost::bad_expression e) {
    std::cout << e.what() << "\n";
    return 1;
  }
  std::string str = "3.14 qwerty";
  boost::match_results<std::string::const_iterator> what;
  std::string::const_iterator begin = str.begin();
  std::string::const_iterator end = str.end();
  if (boost::regex_search(begin, end, what, expr) && what[0].first == begin) {
    std::cout << std::string(what[0].first, what[0].second);
  }
  return 0;
}
т.е. я проверяю совпадает ли итератор begin результата с итератором begin исходного текста, если да то это то - что мне нужно,  иначе совпадение было, но не начиналось с первого символа, а это уже не то что надо.
Всеравно что идет после, главное чтобы совпадение начиналось с первого символа входящего текста.

Интересует более оптимизированный способ, входящий текст может быть огромным, а т.к. мне нужно проверять только с первого символа то лишний проход по всему тексту будет пустой тратой времени/ресурсов.
Заранее спасибо.

Уточню, если первый символ из входящего текста не совпал с регуляркой, то сразу останавливать поиск, т.е. дальнейшие попытки совпадений уже не нужны.

Это сообщение отредактировал(а) rudvil - 11.7.2010, 18:59
--------------------
xor
PM MAIL Skype   Вверх
boostcoder
Дата 11.7.2010, 19:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



если формат исходных данных регламентирован, тогда используй boost.spirit
PM WWW   Вверх
rudvil
Дата 11.7.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата
если формат исходных данных регламентирован

Не совсем понял, используется обычный std::string.
Цитата
тогда используй boost.spirit 

Нет, спасибо, спирита тут только не хватало..
Неужели нельзя как-нибудь задать флагами, поиск совпадения начиная только с первого символа.
Необязательно использовать regex_search, regex_match тоже сойдет, если конечно можно будет его правильно настроить, собственно "как" меня и интересует.

Это сообщение отредактировал(а) rudvil - 11.7.2010, 19:12
--------------------
xor
PM MAIL Skype   Вверх
rudvil
Дата 12.7.2010, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



нашел!
Цитата
Specifies that the expression must match a sub-sequence that begins at first.
Код
match_continuous

--------------------
xor
PM MAIL Skype   Вверх
chaos
Дата 12.7.2010, 09:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



rudvil, может еще почитать про ^

Код

$str = "Hello world";
print "ok" if $str ~= /^H/;


печатает ок


Это сообщение отредактировал(а) chaos - 12.7.2010, 09:38
PM WWW   Вверх
rudvil
Дата 12.7.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(chaos @ 12.7.2010,  09:37)
rudvil, может еще почитать про ^

Код

$str = "Hello world";
print "ok" if $str ~= /^H/;


печатает ок

Не думаю что это сработает в моем случае т.к.
Цитата
входящий текст может быть огромным
очень маловероятно что там будет всего одна линия.
--------------------
xor
PM MAIL Skype   Вверх
xvr
Дата 13.7.2010, 12:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(rudvil @  12.7.2010,  10:24 Найти цитируемый пост)
Не думаю что это сработает в моем случае
Сработает, т.к. '^' привязывает к началу всей строки (т.е. всего входного текста), а не каждой линии в ней.


PM MAIL   Вверх
rudvil
Дата 13.7.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(xvr @ 13.7.2010,  12:21)
Цитата(rudvil @  12.7.2010,  10:24 Найти цитируемый пост)
Не думаю что это сработает в моем случае
Сработает, т.к. '^' привязывает к началу всей строки (т.е. всего входного текста), а не каждой линии в ней.

Не знал, спасибо. Что же тогда лучше использовать в моем случае?
Я больше склоняюсь к флагу т.к. он изначально задаст определенные условия(если я конечно ничего не напутал), тогда как само регулярное выражение будет проверять условие во время парсинга.
--------------------
xor
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.