我已经坐在这里将近一天了,无法弄清楚,为什么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.
由于这是我的第一个问题,我希望我能为你提供足够的细节来帮助我.提前致谢.
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |