1

我已经在这里坐了将近一天,无法弄清楚为什么 C++11 正则表达式库给了我它的输出。这与寻找模式无关,我已经在各种正则表达式测试器中对其进行了设计和测试。(正则表达式例如

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

if12b031, if12b141, ic12a042

这些是用户名,包含最大长度为 8 个字符的字母和数字,每个用户名用逗号分隔。字符串由用户输入,不能以逗号结尾。逗号之间的空格是可选的。

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

^[A-z0-9]{1,8}(\s*,\s*[A-z0-9]{1,8})*$

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

现在奇怪的是,如果我在上面提到的 regex-tester 中测试它,这种模式是有效的。但它不在我的代码中。

我创建了一个小示例程序,它仅用于模式测试。

#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;
}

我使用以下代码编译:

c++ -std=c++11 -o test test.cpp

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

只要输入长度超过 1,它总是会打印出“不匹配”。而且看起来,因为 regex_match 并不关心模式,只要输入长度为 1。

这是为什么?老实说,我看不出我在哪里犯了错误。它甚至可以匹配一些特殊字符,如 $ 或 %,但不匹配 §。

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

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

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

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

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

我在虚拟机 (VMWare) 中运行 Ubuntu 13.10 64 位 Gnome,但我也在我的笔记本电脑上尝试过,它被安装为双引导系统。gcc 版本是 4.8.1。

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

4

1 回答 1

5

gcc 的正则表达式实现可能会编译,但仅此而已,它主要在 gcc 4.8 中未实现(参见第 28 条)。

于 2013-10-19T23:34:54.667 回答