簡體   English   中英

Vim語法突出顯示(正則表達式)

[英]Vim Syntax Highlighting (Regular Expression)

我試圖使用c.vim插件在Vim中突出顯示成員變量。

例如,在

struct sockaddr_in sa;
sa.sin_family = AF_INET;

我想強調sin_family

所以,這是我的語法匹配代碼:

syn match   cCustomMember "\(\.\)\@<=[a-zA-Z0-9_]\+\s*\((\)\@!"
hi def link cCustomMember Number

基本上我在這里要說的是必須有一個. 在前面,后跟多個單詞字符,可選地后跟空格,並確保沒有括號跟隨。

但是突出顯示正則表達式的上述語法似乎在Vim中無法正常工作。 例如,如果我有這樣的代碼:

getWrapper()->error( NO_VALID_ID, CONNECT_FAIL.code(), CONNECT_FAIL.msg());

.msg和.code突出顯示,但最后一個字母不是。 但我不想突出顯示成員函數(以圓括號結尾)

我認為它有點類似於python中的這個正則表達式問題:

a = re.compile("(?<=\.)(?:\w+)(?!\()")
print a.search(".test(").group() #produces tes, which it's desired to match nothing
print a.search(".test").group()  # produces test

如何對整個群體而不是單個字母進行否定預測。

說明

您正在努力解決的問題是由於現代正則表達式引擎在尋找匹配時的基本方式,稱為回溯 Jan Goyvaerts在他的帖子“ 非預期的回溯可以咬你 ”中簡明扼要地說:

當正則表達式引擎遇到與字符串中的下一個字符不匹配的正則表達式標記時,會發生回溯。 然后,正則表達式引擎將備份到目前為止匹配的部分內容,以嘗試不同的替代方案和/或重復。 理解這個過程將會在猜測和理解正則表達式與它的作用與不作用之間產生差異。

在你的情況下,當前瞻斷言匹配時,正則表達式引擎將回溯,測試匹配的較短組合 - 以及.cod.ms都可以。 下面顯示了會發生什么,垂直條分隔正則表達式已經從字符串的其余部分消耗的字符.code()

.|code()   # good start => try next char
.c|ode()   # matches => try next char
.co|de()   # matches => try next char
.cod|e()   # matches => try next char
.code|()   # whoops, next char is "(" => track back
.cod|e()   # matches => we’re done here

請注意,只有在使用貪婪量詞時才會這樣,就像在代碼中一樣; 一個懶惰的量詞符合.c 請參閱關於懶惰與貪婪量詞的正則表達式教程

解決這個問題的明顯方法是在前瞻之前禁止回溯,有效地“鎖定”正則表達式已經消耗的模式部分:成員函數永遠不會匹配。 一些正則表達式引擎將允許您使用原子分組或甚至占有量詞 (這實際上是原子分組的語法糖)來做到這一點 - 更為人所知的是之前鏈接的頁面上列出的那些。 然而,Vim的正則表達式引擎不是其中之一

一種不那么直截了當且更脆弱的方法是重新定義你正在尋找的東西:而不是匹配開頭paren的前瞻斷言,使用一個正向前瞻斷言,匹配將成員變量與其他代碼分隔的所有有效字符(空格,逗號,分號) ,關閉paren,行尾 - 檢查你的來源更多) - 基本上只是一個開放的paren和另一個名字。 我會留給你翻譯成Vim的正則表達式語法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM