Bash
nano 突出顯示在匹配 shell 數組括號時失敗
最後兩個數組擴展沒有得到正確的突出顯示:
這是
sh.nanorc
定義它的設置:# More complicated variable names; handles braces and replacements and arrays. color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"
我必須在正則表達式中修復什麼才能趕上這個失誤?
像這樣的正則表達式有點像只寫語言,但我認為
(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?
中間的 擷取了數組索引。它也不辨識[*]
為索引。很難正確解決這個問題,因為數組索引幾乎可以是任意的 shell“表達式”。在整數索引數組中,索引被視為算術擴展,類似的東西
[i+j]
可以使用 和 的i
和j
。在關聯數組中,它可以用於例如[$x$y]
連接。[i+a[j]]
如果要在 shell 中做一些過於復雜的事情,也可能是這樣。解析語法高亮幾乎需要一個完整的解析器,而不是一個簡單的正則表達式。(然後是命令替換,但我們不要去那裡……)無論如何,很容易讓它接受變數名前面的
[*]
and ,這是更改的部分:$
... (\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])? ... ^^^ ^^^^
以及由此產生的整行:
color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"
據我所知,這
${arr[]}
是一個錯誤,所以我不確定它是否應該全部突出顯示。如果這是最新版本的正則表達式,您可能還需要考慮發布錯誤報告。