我想用正則表達式來檢查這種字符串:正則表達式不匹配。在線發電機做
2020_2021_01_01
我在一個變量的推杆,再說$會話
,所以我做的:
if [[ "$session" =~ \d{4}[_]\d{4}[_]\d{2}[_]\d{2} ]]; then
stuff
fi
你看......這是行不通的......但我不知道爲什麼....
任何幫助嗎? 感謝!
我想用正則表達式來檢查這種字符串:正則表達式不匹配。在線發電機做
2020_2021_01_01
我在一個變量的推杆,再說$會話
,所以我做的:
if [[ "$session" =~ \d{4}[_]\d{4}[_]\d{2}[_]\d{2} ]]; then
stuff
fi
你看......這是行不通的......但我不知道爲什麼....
任何幫助嗎? 感謝!
bash manual相當簡潔地解釋了當使用=~
運算符時,運算符右側的字符串被認爲是擴展正則表達式並相應匹配(如在「正則表達式(3))」中所述。
這裏,regex(3)
是man 3 regex
的參考,這可能解釋什麼是「擴展正則表達式」。較長的描述將是「Posix標準擴展正則表達式」,您可以在Posix document中找到這些文檔。如果您使用在線正則表達式測試器,請確保選擇「Posix正則表達式」。
簡而言之,它們不包括Perl主題,如\d
。您可以編寫[[:digit:]]
或(如果您使用的是C語言環境)[0-9]
。
所以,你的正則表達式也可以寫成:
([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}
(沒有必要引用_)。但是,請注意,=~
運算符會查找與模式匹配的子字符串,而不是測試左側運算符是否精確地匹配模式。所以你很可能真的想要一個錨定的匹配:
^([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}$
反斜槓字符是bash shell中的轉義字符。在你的榜樣,我認爲這是使得正則表達式這樣寫的:
d{4}[_]d{4}[_]d{2}[_]d{2}
您可以通過測試證實了這一點,$會話設置爲dddd_dddd_dd_dd
要解決此,在保持反斜槓字符正則表達式,你需要「逃避」它。在你的情況下,在每個反斜槓之前加上一個「額外的」反斜槓就可以解決這個問題。 shell將看到兩個反斜槓,並將第二個作爲字符串的一部分。
if [[ "$session" =~ \\d{4}[_]\\d{4}[_]\\d{2}[_]\\d{2} ]]; then
我不確定是否還有其他需要轉義的字符。這需要一個真正的簡短腳本,一個可以更改和運行的腳本,以確定哪些工作正常,哪些不工作。你能匹配的字符串,一個數字字符等開始
(整個逃逸的事情變得funkier ...雙引號內,單引號內,...)
有一個網站我曾經使用過,放入我想要的字符串,它會讓我回到它在shell腳本中看起來需要的東西,我沒有鏈接。可能有一個正則表達式測試器,讓你測試「bash」正則表達式。
實際上,\ d在posix regexen中不起作用。但是你是對的,如果它確實起作用了,它將需要被寫入一個額外的轉義,因爲bash不會讓你引用regex操作符(引用的字符是自匹配的,不管它們是什麼)。 – rici 2014-09-29 01:45:25
當你說'在線生成器',這是否意味着你已經嘗試過它在Web應用程序的正則表達式?你能提供一個鏈接嗎?另外,輸出是什麼?它與你期望的有什麼不同? – mechalynx 2014-09-29 01:28:26