我已经在这里坐了将近一天,无法弄清楚为什么 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。
由于这是我的第一个问题,我希望我提供了足够的细节来帮助你们。提前致谢。