C++ C++;11正则表达式范围

C++ C++;11正则表达式范围,c++,regex,c++11,range,match,C++,Regex,C++11,Range,Match,我正在尝试编写一个正则表达式,它将匹配ascii表中的特定符号和符号范围。这个正则表达式应该相当复杂,但我没有立即创建它,所以我决定先创建一个简单得多的正则表达式,但即使这次我也失败了。所以我问这个简单的正则表达式 #include <iostream> #include <string> #include <regex> int main () { std::string s ("$"); std::smatch m; std::

我正在尝试编写一个正则表达式,它将匹配ascii表中的特定符号和符号范围。这个正则表达式应该相当复杂,但我没有立即创建它,所以我决定先创建一个简单得多的正则表达式,但即使这次我也失败了。所以我问这个简单的正则表达式

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

int main ()
{
    std::string s ("$");
    std::smatch m;

    std::regex e ("([\\x21\\x23-\\x25]+)");

    std::regex_search (s,m,e);

    for (int i = 1; i < m.size(); i++)
    {
        std::cout << m[i] << " ";
    }

    std::cout << std::endl;

    return 0;
}
因此,在我的代码示例中,我尝试获得“$”匹配,但正则表达式失败:我获得空匹配。然而,如果我使用

std::regex e ("([\\x23-\\x25]+)");      //or
std::regex e ("([\\x23-\\x25\\x21]+)"); //or
std::regex e ("([\\x21\\x24-\\x25]+)"); //or
std::regex e ("([\\x21\\x23-\\x24]+)"); 
“$”匹配正确,我得到了非空的匹配结果

所以我真的无法理解这一切的逻辑。您能告诉我问题出在哪里吗?因为我知道正则表达式组[]中的范围(例如,a-z)和单个符号(例如,z)的顺序是不相关的

为什么不简单地使用:

std::regex e ("([!#-%]+)");

我认为他还需要更多的角色,这个例子仅供参考。@kabanus,不是“他”。但是你是对的,所需的正则表达式将包含更多的ascii符号。@JenyaKh我的错,“it”:P.对不起,我通常记得s/he。@JenyaKh你是对的,你可以在正则表达式中的任何地方(多次)使用
-
。除了第一个字符。把它放在那里匹配
-
@PaulEvans,谢谢你的回答,但是“([!#-%])”也不起作用(我以前试过)。顺便说一句,“([!$)”,虽然有效,但也很奇怪。我。@Muscampester,你可以在这里试试。这个问题再次出现。如果我检查一下,正则表达式看起来也不错。g++的哪个版本?我的观点是,这可能是一个编译器错误,解决方案是使用更新的版本。这个问题可能会更新为问为什么该版本的编译器不工作。我在4.9.2中发现了2个bug,这是regex的第一个实现,但不完全是这个。我的建议是,不要花太多时间更新和检查不同的结果。
std::regex e ("([!#-%]+)");