gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:21 24 4
gpt4 key购买 nike

我已经坐在这里将近一天了,我想不通为什么 C++11 正则表达式库会给我这样的输出。这与寻找模式无关,我已经在各种正则表达式测试器中设计并测试了它。 (例如 Regexpal)

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

if12b031, if12b141, ic12a042

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

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

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

在这里,用户必须输入至少 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;
}

我使用以下代码编译:

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

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

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

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

如果在 regex 对象的构造函数中尝试了几个 regex_constants

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

  • basic 没有抛出任何错误,但是还是一样的奇怪行为。

  • ECMAScript 提示错误代码 4,这意味着括号。

老实说,我不知道为什么这行不通。

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

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

最佳答案

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

关于regex - Linux下c++ 11中正则表达式的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com