2016-01-21 1206 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

相关问题