Reputation: 1068
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
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