C++无符号字符串类型的正则表达式

C++ regex for unsigned string type

本文关键字:正则表达式 类型 字符串 无符号 C++      更新时间:2023-10-16

Visual C++ 2017: 我使用无符号字符串:

typedef basic_string<unsigned char> ustring;

这工作正常,但是当我尝试以与编译相同的方式使用正则表达式时,会抛出很多我不明白的错误:

#include <regex>
using namespace std;
typedef basic_regex<unsigned char> uregex;
int main()
{
uregex ur;
}

我得到

error C2027: use of undefined type 'std::regex_traits<unsigned char>'

我怀疑regex_traits需要一个 typedef,但我不知道如何定义它。

basic_regex的定义如下:([re.regex])

template <class CharT, class Traits = regex_traits<CharT>>
class basic_regex;

在这里,您实例化regex_traits<unsigned char>. 根据 [re.traits]/1:

专业regex_­traits<char>regex_­traits<wchar_­t>应有效并符合 正则表达式特征类的要求 ([re.req])。

换句话说,regex_traits<unsigned char>可能有效,也可能无效。 您的实现似乎没有提供这样的定义。 顺便说一下,代码在GCC上编译得很好,但在Clang上不能。

没有可移植的方法可以将basic_regexunsigned char一起使用,基于以下证明。

证明:假设,为了矛盾起见,我们使用basic_regex<unsigned char, Traits>,其中Traits是一个正则表达式特征([re.req])。 那么Traits::string_typebasic_string<unsigned char>([tab:re.req]),相当于basic_string<unsigned char, char_traits<unsigned char>>。 但是,char_traits<unsigned char>不能保证可用([char.traits.specializations]),并且不允许我们提供自己的显式专用化,因为unsigned char不是程序定义的类型([namespace.std]),因此没有可移植的方式来使用char_traits<unsigned char>。 这种矛盾表明,我们最初的假设是错误的。 因此,我们已经表明,没有便携式方法可以将basic_regexunsigned char一起使用。