2016-01-21 130 views
3

我目前正在使用正則表達式查找/我的文字編輯器中替換操作,SublimeText 3.正則表達式之前和之後的字符匹配

我已經有很多線路看起來像這樣:

array(self::var1, self::var2, class::var_1, class::var_2, self::varCaps) 

我想要做的是匹配數組中的每個項目。我唯一知道的是每個人都有::字符在中間。

我可以匹配使用

[a-zA-z0-9\_\-]+(?=::) 
//should match 'var1' in self::var1 

很容易地使用

(?<=::)[a-zA-z0-9\_\-]+ 
//should match 'self::' in self::var1 

::字符前的字符串,我也可以搭配::字符後,我將如何結合這兩點來創建一個表達式這匹配整個事情?

編輯:我的文本編輯器是SublimeText 3

+1

難道你不能使用逗號分隔符?似乎更簡單。 – mbroshi

+1

什麼是您的文本編輯器? Vim的?編輯器之間的正則表達式風格不同。 – kennytm

+0

1)我可以使用這種情況下的逗號分隔符,但是我最終想要爲SublimeText設置一個自定義命令,它將使用正則表達式快速匹配任何'string :: string2'。 2)我使用SublimeText 3作爲我的編輯器。 – KroniK907

回答

1

你在你的模式有一個問題:[A-z]範圍相匹配的不僅僅是較低和大寫字母(見[A-z] and [a-zA-Z] difference)更多。

要結合(?<=::)[a-zA-Z0-9_-]+[a-zA-Z0-9_-]+(?=::)(注意轉義與_-是多餘的),你可以使用[a-zA-Z0-9_-]+::[a-zA-Z0-9_-]+(注意::是不能避免,因爲正則表達式無法匹配1個匹配操作不連續的文本匹配的部分)。

現在,[a-zA-Z0-9_]與Sublime Text中的\w不同,因爲\w也匹配所有Unicode字母和數字!如果您不介意,則可以使用\w+::\w+

另外,如果您想讓-僅在單詞字符之間出現一次,請使用\w+(?:-\w+)*::\w+(?:-\w+)* Unicode),或者您可以使用[a-zA-Z0-9_]+(?:-[a-zA-Z0-9_])*::[a-zA-Z0-9_]+(?:-[a-zA-Z0-9_])*僅匹配ASCII字母/數字。

+0

謝謝。很好的解釋!不知何故,我把它放在我的頭上,我必須在所有其他顯然不正確的事情之前匹配'::'。 – KroniK907

相關問題