为什么C ++ 17字符类[:blank:]匹配换行符和回车符?

时间:2017-03-29 14:31:49

标签: regex visual-c++

在Visual Studio 2015中使用POSIX字符类[:blank:]时,我希望换行符和回车符不匹配,但这不是我看到的行为。

http://www.cplusplus.com/reference/regex/ECMAScript/表示POSIX字符类[:blank:]相当于isblank,但它们没有排队。 isblank为空格和制表符返回正数,但对于回车符和换行符返回false,而[:blank:]匹配空格,制表符,换行符和回车符。

这是我的示例代码:

#include <cctype>
#include <iostream>
#include <regex>
#include <string>

using namespace std;

bool reMatches( const regex &re, const char c )
{
    return regex_search( string( 1, c ), re );
}

bool isBlank( const char c )
{
    return isblank( c ) != 0;
}

int main() {
    const char testChars[] = { ' ', '\t', '\r', '\n', '.' };
    const char *dispChars[] = { " ", "\\t", "\\r", "\\n", "." };
    regex explicitClass( "[ \t]" );
    regex posixClass( "[[:blank:]]" );

    for ( unsigned i = 0; i < sizeof( testChars ); ++i )
    {
        char c = testChars[i];
        if ( isBlank( c ) != reMatches( explicitClass, c ) )
            cout << "Mismatch found between isblank & [ \t] for " << dispChars[i] << std::endl;
        if ( isBlank( c ) != reMatches( posixClass, c ) )
            cout << "Mismatch found between isblank & [[:blank:]] for " << dispChars[i] << std::endl;
    }
}

以下是结果输出:

Mismatch found between isblank & [[:blank:]] for \r
Mismatch found between isblank & [[:blank:]] for \n

[ \t]按预期行事,但[[:blank:]]匹配\r\n!我做错了吗?

1 个答案:

答案 0 :(得分:0)

事实证明,这是VC ++中的一个错误。在clang或gcc下运行此代码表现出正确的行为(无输出)。

经过测试的代码:http://rextester.com/MCP44517
错误已提交:https://connect.microsoft.com/VisualStudio/feedback/details/3131111/std-regex-posix-character-class-blank-matches-newlines