在試圖使用擊的內置正則表達式匹配來解析以下類型的串,其是要被轉換成Perl替換表達式(引號不是數據的一部分)模式反向引用到可選的捕獲子表達式
'~#A#B#'
#^^^-- Replacement string.
#| +---- Pattern string.
#+------ Regular expression indicator (no need to escape strings A and B),
# which is only allowed if strings A and B are surrounded with ##.
# Strings A and B may not contain #, but are allowed to have ~.
'#A#B#'
#^------ When regex indicator is missing, strings A and B will be escaped.
'A#B'
# Simplified form of '#A#B#', i. e. without the enclosing ##.
# Still none of the strings A and B is allowed to contain # at any position,
# but can have ~, so leading ~ should be treated as part of string A.
我嘗試了以下模式(同樣,不帶引號):
'^((~)?(#))?([^#]+)#([^#]+)\3$'
也就是說,它聲明領先~#
可選的(和~
它更可選),然後捕獲部分A
和B
,並且只有當它存在於領導者中時,尾要求#
才存在。前導#
僅用於反向引用匹配 - 其他地方不需要,而~
被捕獲以供腳本後續檢查。
然而,這種模式只適用預期與種類最齊全的輸入數據:
'~#A#B#'
'#A#B#'
而不是
'A#B'
一,E,每當龍頭部分缺失, \3
無法匹配。但是,如果將\3
替換爲.*
,則匹配成功,可以看出${BASH_REMATCH[3]}
是空字符串。這是我不明白的地方,假設未設置的變量在Bash中被視爲空字符串。 然後,我如何將反向引用與可選內容進行匹配?
作爲一種變通方法,可以寫一個替代圖案
'^(~?)#([^#]+)#([^#]+)#$|^([^#]+)#([^#]+)$'
但它導致獨特捕獲基團對於每個可能的情況下,這使得代碼不太直觀。
重要說明。正如@anubhava在他的評論中提到的,反向引用匹配可能在某些Bash版本中不可用(可能是構建選項而不是版本號,甚至是某個外部庫的問題)。這個問題當然是針對那些支持這種功能的Bash環境。
嘗試''^(〜?#?)([^#] +)#([^#] +)\ 1 $'',或者如果不需要檢查「〜」 (#^)([^#] +)#([^#] +)\ 1 $' –
對不起,不太清楚,但領先的'〜〜 '只有'#'存在才能存在 - 它們不是兩個獨立的部分。 –
嘗試[^ ^(〜?(#?))([^#] +)#([^#] +)\ 2 $'](https://regex101.com/r/sF1qY1/1) –