在使用正则表达式时,使用 assert 确保匹配的结果:

1
2
3
4
regex  reg("\\w+");
smatch match;
assert(regex_match(value, match, reg));
string s = match[1];

调试的时候,通过监视窗口发现 match[1] 都是空的,但是 regex_match 又是成功的,符合 assert 的条件。

是因为 release 模式下,assert 的代码会被忽略

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
#endif

因此,assert 只能放只读的表达式,不能做出修改!否则无法在 release 模式正常运行。

代码需要改成以下形式:

1
2
3
4
5
regex  reg("\\w+");
smatch match;
bool can = regex_match(value, match, reg);
assert(can);
string s = match[1];