2009-11-05 42 views
0

想象一下,我們必須在vi/vim中構造一個正則表達式。我們必須使用反斜槓來轉義哪些特殊字符?從perl的角度來看vim regexps:用反斜線轉義哪些特殊字符

通過特殊字符表示以下字符:{} |() - [] + *。^ $?我們不得不逃避:{|()+?

並保留原樣:}^$ *。[] -

謝謝。

p.s. AFAIK,我們沒有'?'在vi/vim中的字符,但是'=',而應該也是通過反斜槓逃脫。

+0

'\?'和'\ ='做同樣的工作。如果你激活*非常魔法*模式,那麼'。?'將表示*一個或沒有字符*。 – ZyX 2011-03-19 02:02:36

回答

2

在VIM:

:幫助魔術

+0

謝謝! Vimers稱他們爲'魔術':) – igorp1024 2009-11-06 14:51:05

1

我認爲最簡單的方法,那將無論Vim的magic設定的工作,是

let re = '\V' . escape(fixed_string, '\') 

\V從完全禁止魔法這點在RE中指向。這意味着任何沒有用單個反斜槓(好吧,技術上用奇數個反斜槓)的東西都是正常字符。由於我們在固定字符串中避免了任何反斜槓,因此它不能包含任何魔法字符。

請記住,使用\V實際上,您必須爲所有RE元字符加上反斜槓前綴。所以,如果你正在尋找一個完全由固定字符串的一條線,你會

let full_line_re = '\V\^' . escape(fixed_string, '\') . '\$' 

而且記住,Vim的ignorecasesmartcase設置會影響再次行爲。 \C(區分大小寫)和\c(區分大小寫)交換機的工作方式與\V的工作方式相同:它們將覆蓋其後的任何正則表達式部分的這些設置。

+1

除此之外,還可以使用以下模式:'\ v ^。+(\ VThis不是元字符:。\ v)+'。這裏的用法類似於perl中的'\ Q' ...'\ E'。 – ZyX 2011-03-19 02:00:43

+0

如果你想要模式匹配,爲了重寫'ignorecase'選項,你也可以使用'=〜#'和'=〜?'。在其他情況下,你必須提供'\ c'或'\ C'。 – ZyX 2011-03-19 02:05:03