最后两个数组扩展没有得到适当的突出显示:
这是定义它的设置sh.nanorc
:
# More complicated variable names; handles braces and replacements and arrays.
color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"
我必须在正则表达式中修复什么才能捕获此错误?
答案1
像这样的正则表达式有点像只写语言,但我认为(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?
中间的捕获了数组索引。它也不能识别[*]
为索引。
很难正确修复这个问题,因为数组索引几乎可以是任意的 shell“表达式”。在整数索引数组中,索引被视为算术扩展,类似的[i+j]
方法可以使用 和 的i
和j
。在关联数组中,它可以[$x$y]
用于串联。[i+a[j]]
如果要在 shell 中执行过于复杂的操作,也可能会出现这种情况。解析语法突出显示几乎需要一个完整的解析器,而不是一个简单的正则表达式。 (然后还有命令替换,但我们不去那里......)
无论如何,很容易让它接受变量名前面的[*]
和,这是更改的部分:$
... (\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])? ...
^^^ ^^^^
以及由此产生的全行:
color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"
据我所知,${arr[]}
这是一个错误,所以我不确定是否应该完整突出显示它。
如果这是最新版本的正则表达式,您可能还需要考虑发布错误报告。