【问题标题】:Regex to match before and after a character正则表达式匹配字符之前和之后
【发布时间】:2016-01-21 20:18:35
【问题描述】:

我目前正在寻找在我的文本编辑器 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) 我可以在这种情况下使用逗号分隔符,但是我最终想为 SublimeText 设置一个小的自定义命令,该命令将使用正则表达式快速匹配任何string::string2。 2) 我使用 SublimeText 3 作为我的编辑器。
  • \w+::\w+ 怎么样?
  • 史蒂文,你是一个天才......或者我只是很密集:P不知道为什么我没有想到这一点。不知何故,我想到我需要首先匹配::

标签: regex sublimetext3 sublimetext


【解决方案1】:

您的模式存在问题:[A-z] 范围不仅匹配大小写字母(请参阅[A-z] and [a-zA-Z] difference)。

要组合(?&lt;=::)[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 字母/数字。

【讨论】:

  • 谢谢。很好的解释!不知何故,我想到我必须在其他所有内容之前匹配::,这显然是不正确的。
猜你喜欢
  • 2021-01-05
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多