如何使用c++11的正则表达式匹配一些通用字节?

如何使用c++11的正则表达式匹配一些通用字节?,c++,regex,c++11,C++,Regex,C++11,我需要这样做: const regex setData("^(setDataArray:)[\\x00-\\xFF]{8,8}$"); 换句话说,我需要识别一个字符串,后跟一些通用字节。这是一个internet协议,但在编译对象的过程中,它在运行时给了我一个错误。 我想原因是我不能只使用8位字符。有办法解决吗 编辑:正如建议的那样,我附加了一个简单的程序来解释这个问题: #include <regex> using namespace std; const regex setDa

我需要这样做:

const regex setData("^(setDataArray:)[\\x00-\\xFF]{8,8}$");
换句话说,我需要识别一个字符串,后跟一些通用字节。这是一个internet协议,但在编译对象的过程中,它在运行时给了我一个错误。 我想原因是我不能只使用8位字符。有办法解决吗

编辑:正如建议的那样,我附加了一个简单的程序来解释这个问题:

#include <regex>
using namespace std;

const regex setData("^(setDataArray:)[\\x00-\\xFF]{8,8}$");

int main()
{
        return EXIT_SUCCESS;
}

当在Windows 8.1上使用visual studio 2013编译时,此程序在第3行崩溃。我相信这会起作用:

const regex setData(R"(^(setDataArray:)[\x00-\xFF]{8,8}$)", 
      std::regex_constants::basic);
我更改了语法以使用原始字符串常量,R。。。语法,以避免必须转义斜杠字符,使其更易于阅读,但这只是为了使其美观

相应的变化是添加了std::regex_constants::basic,这导致regex使用基本Posix语法而不是默认的ECMAScript语法。在这种情况下,使用ECMAScript版本应该没有问题,但我怀疑Microsoft的实现中可能存在问题

标准ECMAScript语法与C++11中使用的稍加修改的版本之间存在细微差别。特别是字符范围[B-E]形式不是原始ECMAScript语法的一部分,而是在C++11中指定为ECMAScript语法的一部分


你可以在

上阅读更多关于各种语法及其提供的内容……你是说你在寻找十六进制符号?你在找setDataArray:x25 ect吗?或者你在寻找一个角色?我从来没有将正则表达式用于非平面文本处理,所以我不知道这是否可能…下面是一个示例,您的字符串应该是const regex setData^setDataArray:[\\x00-\\xFF]{8}$;而是将{8,8}改为{8}?您的模式正在搜索8个十六进制ASCII字符。这些是ASCII字符串还是UNICODE字符串?我需要匹配setDataArray的固定字符串是纯ASCII字符串,但另一部分实际上不是字符串。只是一组字节作为掩码。@MadScienceDreams要澄清的是:我没有试图匹配setDataArray:x25等等,也没有寻找任何字符。我需要匹配setDataArray:后跟八个通用字节,包括字符、控制代码等。从空字符到\xfT范围内的零字节\\x00将永远不会作为字符串的一部分进行匹配,它将作为字符串$的结尾进行匹配。您必须以某种方式将缓冲区的大小传递给匹配算法,据我所知,正则表达式无法做到这一点。感谢您的澄清和工作示例!