boost :: regex_search - boost снова убивает клетки моего мозга - PullRequest
1 голос
/ 21 октября 2010

Хорошие программисты делают простые вещи легкими, верно? И это не значит, что документация по бусту делает вашу жизнь менее беспокойной ...

Все, что я хочу, это реализация для:

// fulfils the function of a regex matching where the pattern may match a
// substring instead of the entire string
bool search( std::string, std::string, SomeResultType )

Так что его можно использовать как:

std::string     text, pattern;
SomeResultsType match;

if( search( text, pattern, match ) )  
{
   std::string result      = match[0];

   if( match[1].matched )
      // where this is the second capture group, not recapturing the same group
      std::string secondMatch = match[1];

}

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

boost :: regex_match делает это довольно просто с boost :: cmatch, за исключением того, что он соответствует только всей строке, поэтому я адаптировал все свои шаблоны для соответствия целым строкам, но я чувствую, что это грязный хак и предпочел бы более правильное решение. Если бы я знал, что это займет много времени, я бы застрял с regex_match

Также добро пожаловать, копия Чтение ускоренной документации для чайников

На следующей неделе в Делайте это просто и легко с надстройкой , функциональными связующими! Нет, просто шучу, я бы никому этого не сделал.

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Я думаю, что вы хотите regex_search: http://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/ref/regex_search.html

Вероятно, вам нужна эта перегрузка: bool regex_search (const basic_string & s, match_results :: const_iterator, Allocator> & m, const basic_regex & e, match_flag_type flags= match_default);

Это похоже на то, что вы хотели - SomeResultsType является smatch, и вам нужно сначала преобразовать ваш шаблон в регулярное выражение.

0 голосов
/ 21 октября 2010

В Windows вы можете использовать .NET Regex class :

Пример (скопировано со связанной страницы):

#using <System.dll>

using namespace System;
using namespace System::Text::RegularExpressions;
int main()
{
   // Define a regular expression for repeated words.
   Regex^ rx = gcnew Regex( "\\b(?<word>\\w+)\\s+(\\k<word>)\\b",static_cast<RegexOptions>(RegexOptions::Compiled | RegexOptions::IgnoreCase) );

   // Define a test string.        
   String^ text = "The the quick brown fox  fox jumped over the lazy dog dog.";

   // Find matches.
   MatchCollection^ matches = rx->Matches( text );

   // Report the number of matches found.
   Console::WriteLine( "{0} matches found.", matches->Count );

   // Report on each match.
   for each (Match^ match in matches)
   {
      String^ word = match->Groups["word"]->Value;
      int index = match->Index;
      Console::WriteLine("{0} repeated at position {1}", word, index);   
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...