纳米突出显示在匹配外壳数组括号时失败

纳米突出显示在匹配外壳数组括号时失败

最后两个数组扩展没有得到适当的突出显示:

这是定义它的设置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]方法可以使用 和 的ij。在关联数组中,它可以[$x$y]用于串联。[i+a[j]]如果要在 shell 中执行过于复杂的操作,也可能会出现这种情况。解析语法突出显示几乎需要一个完整的解析器,而不是一个简单的正则表达式。 (然后还有命令替换,但我们不去那里......)

无论如何,很容易让它接受变量名前面的[*]和,这是更改的部分:$

... (\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])? ...
                    ^^^                          ^^^^

以及由此产生的全行:

color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"

据我所知,${arr[]}这是一个错误,所以我不确定是否应该完整突出显示它。

如果这是最新版本的正则表达式,您可能还需要考虑发布错误报告。

相关内容