Linux下c ++ 11中正则表达式的奇怪行为

Tho*_*ger 1 regex linux c++11

我已经坐在这里将近一天了,无法弄清楚,为什么C++ 11正则表达式库为我提供输出.这不是找到模式,我已经设计并在那里的各种正则表达式测试中测试它.(例如Regexpal)

我想要处理的示例字符串是:

if12b031, if12b141, ic12a042
Run Code Online (Sandbox Code Playgroud)

这些是用户名,包含最多8个字符的字母和数字,每个用户名用逗号分隔.该字符串由用户输入,不得以逗号结尾.逗号之间的空格是可选的.

这种模式是我解决这个问题的方法:

^[A-z0-9]{1,8}(\s*,\s*[A-z0-9]{1,8})*$
Run Code Online (Sandbox Code Playgroud)

在这里,用户必须输入至少1个用户名,但可以输入任意数量的用户名,只要它们用逗号分隔并且最大长度为8个字符.

现在,当我在上面提到的正则表达式测试器中测试它时,这个模式是有效的.但它不在我的代码中.

我创建了一个小例子程序,它只是关于模式测试.

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

using namespace std;

int main(int argc, char const *argv[])
{
string tmp;
string pattern = "^[A-z0-9]{1,8}(\\s*,\\s*[A-z0-9]{1,8})*$";

while(true)
{
    getline(cin, tmp);

    cout << "input: " << tmp << endl;
    cout << "pattern: " << pattern << endl;

    try {
        if(regex_match(tmp, regex(pattern, std::regex_constants::basic))) {
            cout << "match" << endl;
        }
        else
        {
            cout << "no match" << endl;
        }
    } catch (std::regex_error& e) {
        cout << e.code() << endl;
    }
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码编译:

c++ -std=c++11 -o test test.cpp
Run Code Online (Sandbox Code Playgroud)

现在奇怪的是,我甚[A-z]{1,8}至无法获得简单的模式来工作.它只是给了我一个匹配,如果我输入一个字符,但它也匹配,如果我输入一个数字,我只是不明白为什么.

一旦输入长度超过1,它总是打印出"不匹配".看起来,只要输入长度为1,regex_match就不关心模式.

这是为什么?老实说,我不知道我在哪里弄错了.它甚至匹配一些特殊字符,如$或%,但它与§不匹配.

如果regex_constants在正则表达式对象的构造函数中尝试了几个.

  • extended例如,一旦我添加括号,就会给我一个错误代码5.即使没有它们,也不会匹配任何超过1个字符的输入.

  • basic 不会抛出任何错误,但它仍然是同样的奇怪行为.

  • ECMAScript 抱怨错误代码4,这意味着括号.

老实说,我没有想法,为什么这不起作用.

我在虚拟机(VMWare)中运行Ubuntu 13.10 64位Gnome,但我也在我的笔记本电脑上试用了它,它作为双启动系统安装.gcc版本是4.8.1.

由于这是我的第一个问题,我希望我能为你提供足够的细节来帮助我.提前致谢.

Kil*_*nDS 5

gcc的正则表达式实现可能会编译,但就此而言,它主要在gcc 4.8中未实现(参见第28项).

  • 为了完整起见,我会提到最近发布的libstdc ++版本已经实现了`<regex>`. (2认同)