数组切片表达式

JEP

5

作者

道林

状态

认可的

创建

2013年12月8日

摘要

本文建议修改JMESPath语法,以支持访问数组特定部分的数组切片。

动机

当前的JMESPath语法不允许提取数组的特定部分。

以下示例可以使用数组切片表示法,使用可选的开始位置、可选的停止位置和可以小于或大于0的可选步骤:

  1. 提取每N个索引(例如,仅偶数 [::2] ,只有奇数 [1::2] 等)

  2. 仅提取给定起始位置后的元素: [2:]

  3. 仅提取给定停止位置之前的元素: [:5]

  4. 提取给定起始位置和结束位置之间的元素: [2::5]

  5. 只有最后5个元素: [-5:]

  6. 最后五个元素的顺序相反: [:-5:-1]

  7. 颠倒数组的顺序: [::-1]

句法

此语法引入了Python风格的数组切片,允许开始位置、停止位置和步骤。此语法还建议遵循与python切片相同的语义。

[start:stop:step]

表达式的每个部分都是可选的。可以省略起始位置、停止位置或步骤。切片表达式中最多只能提供三个值。

step值决定在从数组中提取每个元素后,如何跳过索引。步骤1(默认步骤)不会跳过任何索引。从数组中提取值时,步长值为2将每隔一个索引跳过一次。步长值-1将从数组中以相反的顺序提取值。步长值-2将从数组中以相反的顺序提取值,同时跳过其他索引。

切片表达式遵循以下规则:

  1. 如果给定的起始位置为负,则计算为数组的总长度加上给定的起始位置。

  2. 如果没有给定起始位置,如果给定步长大于0,则假定为0;如果给定步长小于0,则假定为数组的结束。

  3. 如果给定负停止位置,则将其计算为数组的总长度加上给定的停止位置。

  4. 如果没有给定停止位置,如果给定步长大于0,则假定为数组的长度;如果给定步长小于0,则假定为0。

  5. 如果省略给定步骤,则假定为1。

  6. 如果给定步骤为0,则必须引发错误。

  7. 如果要切片的元素不是数组,则结果必须是 null .

  8. 如果被切片的元素是一个数组并且没有产生结果,那么结果必须是空数组。

修正语法

以下修改的JMESPath语法支持数组切片。

expression        = sub-expression / index-expression / or-expression / identifier / "*"
expression        =/ multi-select-list / multi-select-hash
sub-expression    = expression "." expression
or-expression     = expression "||" expression
index-expression  = expression bracket-specifier / bracket-specifier
multi-select-list = "[" ( expression *( "," expression ) ) "]"
multi-select-hash = "{" ( keyval-expr *( "," keyval-expr ) ) "}"
keyval-expr       = identifier ":" expression
bracket-specifier = "[" (number / "*" / slice-expression) "]" / "[]"
slice-expression  = ":"
slice-expression  =/ number ":" number ":" number
slice-expression  =/ number ":"
slice-expression  =/ number ":" ":" number
slice-expression  =/ ":" number
slice-expression  =/ ":" number ":" number
slice-expression  =/ ":" ":" number
number            = [-]1*digit
digit             = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / "0"
identifier        = 1*char
identifier        =/ quote 1*(unescaped-char / escaped-quote) quote
escaped-quote     = escape quote
unescaped-char    = %x30-10FFFF
escape            = %x5C   ; Back slash: \
quote             = %x22   ; Double quote: '"'
char              = %x30-39 / ; 0-9
                    %x41-5A / ; A-Z
                    %x5F /    ; _
                    %x61-7A / ; a-z
                    %x7F-10FFFF

目录