![纳米突出显示在匹配外壳数组括号时失败](https://linux22.com/image/207954/%E7%BA%B3%E7%B1%B3%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E5%9C%A8%E5%8C%B9%E9%85%8D%E5%A4%96%E5%A3%B3%E6%95%B0%E7%BB%84%E6%8B%AC%E5%8F%B7%E6%97%B6%E5%A4%B1%E8%B4%A5.png)
最后两个数组扩展没有得到适当的突出显示:
这是定义它的设置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[]}
这是一个错误,所以我不确定是否应该完整突出显示它。
如果这是最新版本的正则表达式,您可能还需要考虑发布错误报告。