2

使用 terraform 创建胶水表时出现以下错误

 at 'table.storageDescriptor.columns.5.member.type' failed to satisfy constraint: Member must satisfy regular expression pattern: [\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF\t]*;

terraform 列类型如下所示:

struct<
subscriber_id:string,
price_plan_id:string,
usage_rate_id:string,
entitlement_id:string,
charged_gl:string,
uncharged_gl:string,
audit_trail:array<
    struct<
        time:string,
        outcome_details:array<
            struct<balance_id:array<string>,
                balance_delta:string,
                event_type:string,
                invoice_text:string>>>>>

为了可读性,我一直保持缩进。当我将其更改为如下所示的缩小版本时,错误就会消失。

struct<subscriber_id:string,price_plan_id:string,usage_rate_id:string,entitlement_id:string,charged_gl:string,uncharged_gl:string,audit_trail:array<struct<time:string,outcome_details:array<struct<balance_id:array<string>,balance_delta:double,event_type:string,invoice_text:string>>>>>"

AWS 文档还介绍了多个 API 的这种模式。以下是 Glue 表的列类型所提到的内容。

类型 列中数据的数据类型。

类型:字符串

长度约束:最小长度为 0。最大长度为 131072。

模式:[\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF\t]*

要求:否

我想了解这种模式,这种模式是什么意思。我尝试搜索模式中提到的 unicode 字符,但无法识别此处表示的字符。我对正则表达式比较熟悉,但从未遇到过这种模式。

4

1 回答 1

9

匹配“大多数”的 Unicode 字符;但它非常明确地省略了基本的 ASCII 控制字符,尤其是换行符 (U+000A),这就是缩进版本不起作用的原因。

[\u0020-\uD7FF]表示“U+0020 和 U+D7FF 之间的任何单个 Unicode 字符”。这包括所有可打印的 ASCII 范围(包括空格 U+0020 和 A U+0041)、大多数语言中的大多数字符、许多数学符号等等;[\u0020-\uD7FF\uE000-\uFFFD]是“U+0020 和 U+D7FF 之间或 U+E000 和 U+FFFD 之间的任何字符”,这是在开始分配高于 U+10000 的代码点之前定义的所有字符。U+D800 到 U+DFFF 不存在(即使此正则表达式明确包含它们),U+FFFE 和 U+FFFF 也不存在。最后\t是一个 ASCII 制表符 U+0009。

此正则表达式确实允许某些字符,例如不间断空格 U+00A0 和 U+0080 到 U+009F 范围内的其他非 ASCII 控制字符。它不允许更新的字符,例如从 U+1F600 开始的面部表情符号。

如果你有一个匹配 ASCII 字母的正则表达式[A-Za-z]*,你可以用 Unicode 代码点语法将它重写为[\u0041-\u005A\u0061-\u007A]*.

于 2018-12-07T02:46:19.037 回答