数组切片表达式¶
- JEP
5
- 作者
道林
- 状态
认可的
- 创建
2013年12月8日
摘要¶
本文建议修改JMESPath语法,以支持访问数组特定部分的数组切片。
动机¶
当前的JMESPath语法不允许提取数组的特定部分。
以下示例可以使用数组切片表示法,使用可选的开始位置、可选的停止位置和可以小于或大于0的可选步骤:
提取每N个索引(例如,仅偶数
[::2]
,只有奇数[1::2]
等)仅提取给定起始位置后的元素:
[2:]
仅提取给定停止位置之前的元素:
[:5]
提取给定起始位置和结束位置之间的元素:
[2::5]
只有最后5个元素:
[-5:]
最后五个元素的顺序相反:
[:-5:-1]
颠倒数组的顺序:
[::-1]
句法¶
此语法引入了Python风格的数组切片,允许开始位置、停止位置和步骤。此语法还建议遵循与python切片相同的语义。
[start:stop:step]
表达式的每个部分都是可选的。可以省略起始位置、停止位置或步骤。切片表达式中最多只能提供三个值。
step值决定在从数组中提取每个元素后,如何跳过索引。步骤1(默认步骤)不会跳过任何索引。从数组中提取值时,步长值为2将每隔一个索引跳过一次。步长值-1将从数组中以相反的顺序提取值。步长值-2将从数组中以相反的顺序提取值,同时跳过其他索引。
切片表达式遵循以下规则:
如果给定的起始位置为负,则计算为数组的总长度加上给定的起始位置。
如果没有给定起始位置,如果给定步长大于0,则假定为0;如果给定步长小于0,则假定为数组的结束。
如果给定负停止位置,则将其计算为数组的总长度加上给定的停止位置。
如果没有给定停止位置,如果给定步长大于0,则假定为数组的长度;如果给定步长小于0,则假定为0。
如果省略给定步骤,则假定为1。
如果给定步骤为0,则必须引发错误。
如果要切片的元素不是数组,则结果必须是
null
.如果被切片的元素是一个数组并且没有产生结果,那么结果必须是空数组。
修正语法¶
以下修改的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