2010-09-06 36 views
4

我想弄清楚我在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) 

回答

4

啊,有趣的解釋,但並不完全正確。

\^確實指的是一個文字迴旋曲。

*並不意味着「一個以上」,這意味着「以上」,所以乾脆\^*匹配什麼,如果它需要以使該表達式的其餘部分成功,並在此外,它顯然會「解決」搜索的其餘部分,使其更容易成功。

我想象着這片充滿你的拼圖不會有任何麻煩理解休息...

更新:我覺得拼圖的最後一塊是vi那樣的東西有點不同帶有超出前後關係的正則表達式魔法字符。如果你在一個不可能變魔術的環境中使用一個,那麼你不會像使用Perl或Ruby那樣得到一個錯誤,這個角色就變成了非魔術。並且*不會重複^定位點,因此像/*//^*/這樣的搜索將分別查找任何實際的*或以實際的*開頭的行。

+0

羅斯 - 謝謝,但我還是不太明白。我提到'一個或多個'只是一個錯字;我知道\ *表示'零或更多'(但實際上在默認的vim regex中*中繼器應該沒有初始反斜槓)。但是我仍然無法弄清楚你的解釋,因爲帶有開始反斜槓的版本不匹配以非星號開頭的字符串。我已經添加了其他示例來展示這一點。 – 2010-09-06 02:32:20

2

'\^*\*\s'匹配上,因爲第一個星號表示零個或多個^(在這種情況下,零),然後下一個文字*第一次出現的匹配。

2

爲什麼不簡單使用:'^\*\+'?這將匹配VIM中行首的一個或多個星號。

+0

謝謝。那正是我想要的。開始與*中繼器錯誤的方向,並沒有想到切換方法。 – 2010-09-06 06:28:58