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

How I can use c++11's regex for matching some generic bytes?

本文关键字:字节 c++11 何使用 正则表达式      更新时间:2023-10-16

我需要这样做:

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

换句话说,我需要识别一个字符串,后跟一些通用字节(它是一个互联网协议),但它在运行时,在编译对象期间给我一个错误。我认为原因是我不能只使用 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);

我将语法更改为使用 Raw 字符串常量(R"( ... )"语法),以避免转义斜杠字符并使其更易于阅读,但这只是为了让它更漂亮。

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

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

您可以在以下位置阅读有关各种语法及其提供的内容的更多信息cppreference.com