正则表达式匹配一个字符之前和之后

时间:2016-01-21 20:18:36

标签: regex sublimetext3 sublimetext

我目前正在寻找在我的文本编辑器SublimeText 3中使用正则表达式进行查找/替换操作。

我所拥有的很多行看起来像这样:

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

我想要做的是匹配数组中的每个项目。我唯一知道的是每个人中间都有::个字符。

我可以使用

轻松匹配::字符前的字符串
(?<=::)[a-zA-z0-9\_\-]+
//should match 'self::' in self::var1

我也可以使用

::个字符后匹配
[a-zA-z0-9\_\-]+(?=::)
//should match 'var1' in self::var1

我如何组合这两件事来创建一个与整个事物相匹配的表达式?

编辑:我的文本编辑器是SublimeText 3

1 个答案:

答案 0 :(得分: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字母/数字。