2014-02-18 71 views
2

在惡意模式下使用Emacs時,我遇到了包含\_的正則表達式的問題,例如,惡意模式和正則表達式中的Emacs

/TAG1\_.\{-}TAG2 
/TAG1\_s*TAG2 

例如,第一正則表達式中的Vim用於查找TAG1TAG2,包括空格,新行之間的任何文本塊。它將與例如

TAG1 
text 

more text TAG2 

然而,在Emacs邪模式,只要我型\_,我得到一個Premature end of regular expression錯誤消息。如預期其他 搜索內容,而\_,作爲

/TAG1\n*TAG2 

工作,所以這個問題特別是\_。我試圖與邪惡組織設置玩一下,但無濟於事。任何暗示問題可能出現的地方?

P.S .:無論我是否使用GUI,問題都會發生。在Vim中我沒有遇到任何問題

+0

當表達式只是'\ _'時它匹配什麼? – sln

+0

'-'通常不需要轉義。一些自制的引擎使用像這樣的特徵來表示元(例如'\ <'是字邊界的開始) – sln

+0

當表達式只是'/ \ _'它表示'不完整輸入'。如果使用'_'而不逃脫,則按預期將其視爲任何其他字符:例如, '/ TAG1_s * TAG2'找到字符串'TAG1_sTAG2'(但我想查找的是'TAG1 TAG2'!) – summer

回答

3

這不是邪惡模式的問題,在emacs正則表達式中\有特殊的含義。來自emacs manual

\有兩個功能:它引用特殊字符(包括'\'),並引入額外的特殊結構。因爲'\'引用了特殊字符,'\ $'是隻匹配'$'的正則表達式,而'['是隻匹配'['的正則表達式,等等。

你將不得不逃離\,所以搜索TAG\您將需要輸入正則表達式TAG\\

您可能會發現this頁學習elisp的正則表達式是有用的。

+0

謝謝你的回答,Iqbal。但是,我不是在搜索'TAG \'。像Vim中的'/ TAG1 \ _s * TAG2'這樣的正則表達式試圖找到序列'TAG1TAG2',其中'TAG1'和'TAG2'可能被任意數量的空格或新行分隔。這是我想要的邪惡模式下的行爲...並且它不是通過再次逃脫實現的,即'/ TAG1 \\ _ s * TAG2'不起作用。爲了清楚起見,我編輯了我的原始問題。再次感謝鏈接,我正在看它,也許我會在那裏找到解決方案。 – summer

+0

@summer要匹配搜索替換中的換行符,您需要鍵入Cq Cj,以便正則表達式可以是'TAG1 [[:space:]^J] * TAG2'(按Cq Cj輸入^ J) – 2014-03-08 02:52:27

1

如果,正如你在回覆@Iqbal說,你要匹配TAG1,其次是零個或多個字符的空間或換行字符,然後TAG2,然後在Emacs應該是一個正則表達式是這樣寫的: TAG1[ \n]*TAG2

是的,你必須自己閱讀手冊的正則表達式部分。不同的語言以不同的方式處理正則表達式,Emacs Lisp也不例外。

+1

謝謝您的支持回答@德魯。當然,這並不是我想省卻閱讀Emacs正則表達式部分的麻煩。因爲我使用的是惡意模式,所以我必須像處理Vim一樣處理正則表達式(我是一個非常新的Emacs用戶)。我認爲情況並非如此,我感謝你和Iqbal指引我朝着正確的方向前進。 – summer

+1

沒問題;我明白。一般來說,Emacs有自己的做事方式 - 有時候是出於很好的原因,有時主要是爲了「歇斯底里的葡萄乾」。但Emacs非常擅長的一件事就是幫助你理解它。我向任何人瞭解Emacs的第一個建議是:***詢問Emacs ***。近40年來,它一直把自己吹捧爲「自我記錄」,證明解釋自己至少是認真對待的。它通常做得很好。該網關正在瞭解'C-h C-h'的可用功能以及如何在兩本Emacs手冊中解決問題。請享用。 – Drew