匹配字符前后的正则表达式

Regex to match before and after a character

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

我有很多行是这样的:

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

您的模式有问题:[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 aware)或者您可以使用 [a-zA-Z0-9_]+(?:-[a-zA-Z0-9_])*::[a-zA-Z0-9_]+(?:-[a-zA-Z0-9_])* 仅匹配 ASCII letters/digits.