正则表达式为a-b,a-c但不是a-a?

时间:2016-04-05 10:43:39

标签: regex

我尝试查找除构造函数之外的方法定义。 为了简化我寻找 abc :: def,foo :: bar而不是foo :: foo

我已经知道如何写一个这样的表达式:

\w[\w\d_]+::\w[\w\d_]+

但是如何确保:: 的左侧部分与正确的部分相匹配?

顺便说一句,我无法检查合格方法名称是否还有类型定义。我有一个非常古老的项目,如果它是int,则不指定类型。

2 个答案:

答案 0 :(得分:2)

请注意,\w已匹配\d_以及\w[\w\d_]+ = \w{2,}

您可以捕获第一个“单词”(::之前)并使用否定前瞻检查::之后的“单词”不等于它:

\b(\w+)::(?!\b\1\b)\w+\b

请参阅regex demo

说明:

  • \b - 领先的字边界
  • (\w+) - 第1组:一个或多个字母数字和下划线字符
  • :: - 连续2次冒号
  • (?!\b\1\b) - 下一个“字”不能与第1组中的值
  • 相同
  • \w+\b - 一个或多个字母数字和下划线字符,后跟一个尾随字边界。

如果您不想匹配单字“单词”,可以使用

\b(\w{2,})::(?!\b\1\b)\w{2,}\b

答案 1 :(得分:1)

您可以使用这样的反向引用捕获第一部分并检查它是否重复。

正则表达式: \b(\w[\w\d_]+)::(?!\1)\w[\w\d_]+

说明:

  • \b(\w[\w\d_]+)与第一部分匹配。

  • 第一部分的
  • (?!\1)否定前瞻。如果重复的整个匹配将被丢弃。

  • \w[\w\d_]+如果不重复,则此部分将匹配。

Regex101 Demo