我想弄清楚我在Vim中得到的一些正則表達式比較結果背後的原因。我試圖匹配以一個或多個星號開頭的字符串。這裏的正則表達式如何把不同的匹配字符串:關於Vim中正則表達式的問題
echo '* text is here' =~ '\^*\*\s' prints 1 (i.e., MATCH)
echo '* text is here' =~ '^*\*\s' prints 0 (NO MATCH)
echo '** text is here' =~ '\^*\*\s' (MATCH)
echo '** text is here' =~ '^*\*\s' (MATCH)
echo '*** text is here' =~ '\^*\*\s' (MATCH)
echo '*** text is here' =~ '^*\*\s' (NO MATCH)
echo 'text is here' =~ '\^*\*\s' (NO MATCH)
echo 'text is here' =~ '^*\*\s' (NO MATCH)
echo '*text is here' =~ '\^*\*\s' (NO MATCH)
echo '*text is here' =~ '^*\*\s' (NO MATCH)
從這些結果我推測,行字符的時候開始(^)是不用反斜槓前綴以下*讀作文字和的backslash_ *也被讀作文字。因此,使用no-initial-backslash方法進行比較時,結果只匹配字符串,後面緊跟着一個空格。
當^ -character前面帶有反斜槓時,第一個星號是文字星號,反斜槓 - 代表「零個或多個前面的字符」。
帶有最初反斜槓的版本爲我提供了我想要的答案;即它匹配以一個或多個星號開頭並跟着一個空格開始的所有且僅有的行。爲什麼是這樣?當我看Vim文檔時,它說\ ^代表文字^,而不是一行的開始。我確定有一個簡單的解釋,但我看不到它。謝謝你的澄清。
我在輸入這個問題時也注意到了一些類似的行爲。也就是說,下面的字符串在第二個星號之前有一個反斜槓,它不會在文本中顯示出來:'^ ** \ s'。
更新:好的,我想我已經對Ross的回答進行了修改,並且看到去錨正在給我想要的結果。解錨也給我一個結果,我不希望,即:
echo 'text* is here' =~ '\^*\*\s' (MATCH)
,所以我現在的問題是:什麼樣的正則表達式將匹配所有且僅與一個或多個星號之後開始的行一個空白?下面的正則表達式靠攏,但未能在最後一個例子:
echo '*** text is here' =~ '^**\s' (MATCH)
echo '* text is here' =~ '^**\s' (MATCH)
echo 'text* is here' =~ '^**\s' (NO MATCH)
echo ' * text is here' =~ '^**\s' (MATCH) -- want a no match here
用斜線星號作爲第一個星號的版本不工作,要麼(即「^ \ ** \ S」)。
最終更新:好的,我想我找到了可用的版本。不過,我不明白它爲什麼起作用。它看起來像所期待的我除了^字符之後的星號,但有後的中繼^似乎荒謬:
echo '*** text is here' =~ '^*\**\s' (MATCH)
echo '* text is here' =~ '^*\**\s' (MATCH)
echo 'text* is here' =~ '^*\**\s' (NO MATCH)
echo ' * text is here' =~ '^*\**\s' (NO MATCH)
羅斯 - 謝謝,但我還是不太明白。我提到'一個或多個'只是一個錯字;我知道\ *表示'零或更多'(但實際上在默認的vim regex中*中繼器應該沒有初始反斜槓)。但是我仍然無法弄清楚你的解釋,因爲帶有開始反斜槓的版本不匹配以非星號開頭的字符串。我已經添加了其他示例來展示這一點。 – 2010-09-06 02:32:20