Al Berger
Al Berger

Reputation: 1068

Can't figure out why regex is not workng

I'm using a c++ regex for matching a string which begins with two words separated by a space and a newline, and containing more text with several new line characters. Something like this:

word1 word2
some
other
text

I'm using the following regex:

wregex rCompound( L"^[а-я-]+ [а-я-]+[\\r\\n](.|\\s)*?" );

a and я are the first and the last lower case letters of the Russian alphabet.

When the match is checked on the following string:

wstring _s( L"а вот\n\
частица разг.\n\
1) Употр.при указании на лицо, предмет, находящиеся поблизости.\n\
2) Употр.при указании на последующий исчерпывающий ответ.\n\
3) Употр.при усилении предикативной части при ответе на вопрос.\n\
4) Употр.при сопоставлении с содержанием предшествующего предложения.\n\
5) Употр.при противопоставлении частей сложного предложения.\n\
6) Употр.при переходе к другой мысли, к другой теме разговора." );

The stack overflow happens. But when the match is checked on the same string, but with the part related to the "3)" removed - the regex works OK:

wstring _s( L"а вот\n\
частица разг.\n\
1) Употр.при указании на лицо, предмет, находящиеся поблизости.\n\
2) Употр.при указании на последующий исчерпывающий ответ.\n\
4) Употр.при сопоставлении с содержанием предшествующего предложения.\n\
5) Употр.при противопоставлении частей сложного предложения.\n\
6) Употр.при переходе к другой мысли, к другой теме разговора." );

The c++ regex implementation is of VS 2013. What can be wrong here?

UPDATE:

The match checking code:

bool _b = regex_match( _s, rCompound );

UPDATE 2:

Below is a code with a test project:

#include "stdafx.h"
#include <regex>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    wregex rCompound( L"^[а-я-]+ [а-я-]+[\\r\\n](.|\\s)*?" );

    wstring _s( L"а вот\n\
  частица разг.\n\
  1) Употр.при указании на лицо, предмет, находящиеся поблизости.\n\
  2) Употр.при указании на последующий исчерпывающий ответ.\n\
  3) Употр.при усилении предикативной части при ответе на вопрос.\n\
  4) Употр.при сопоставлении с содержанием предшествующего предложения.\n\
  5) Употр.при противопоставлении частей сложного предложения.\n\
  6) Употр.при переходе к другой мысли, к другой теме разговора." );

    bool _b = regex_match( _s, rCompound );
    return 0;
}

Upvotes: 2

Views: 150

Answers (1)

Al Berger
Al Berger

Reputation: 1068

I solved this particular issue by rewording the regex as follows:

wregex rCompound( L"^[а-я-]+ [а-я-]+[\\r\\n]*[[:cntrl:][:graph:][:space:]]*?" );

I'm unsure however if this problem is caused by incorrect regex syntax or is this a bug in the regex implementation...

Upvotes: 1

Related Questions