正则表达式:查找具有不同子字符串的字符串

正则表达式:查找具有不同子字符串的字符串

我想找到我的代码中参数不正确的所有字符串。这是我想做的:

查找所有出现的情况:

CreateNewPoint(CorrectPoint.X, IncorrectPoint.Y, other_parameters)
CreateNewPoint(IncorrectPoint.X, CorrectPoint.Y, other_parameters)

并忽略所有出现的情况:

CreateNewPoint(CorrectPoint.X, CorrectPoint.Y, other_parameters)

请注意,在我的示例中,我使用CorrectPointIncorrectPoint变量名称,但这些名称可以是任何名称。

我正在考虑这样的事情:

CreateNewPoint(\(.*\)\.X, \1\.Y, .*)

但我对使用相同变量名但不同变量名的行不感兴趣。

答案1

带有grep和使用标志-P(“解释PATTERN为 Perl 正则表达式”), 您可以使用负前瞻

grep -P 'CreateNewPoint\((.*)\.X, ((?!\b\1\b).)*\.Y, .*\)' /tmp/codefile
  • (?!\b\1\b)意味着下一个事物不能是单词边界包围的先前匹配的单词(使用\b,它可能会错过那些字符串)包括第一场比赛,但不是完全相同的到它。
  • ((?!\b\1\b).)*- 因为您还想匹配\.Y, .*\)之后的内容,所以我们需要告诉grep它检查所有字符(并确保它们与单词不匹配),然后匹配\.Y

vim可以使用 进行类似的匹配/CreateNewPoint(\(.*\)\.X, \(\(\<\1\.\)\@!.\)*\.Y, .*)。它与grep正则表达式类似,但有一些例外:

  • \@!是负前瞻标识符。
  • \<是单词的开头(而不是\b单词边界)。
  • 我们只是说它不能以点结尾,而不是结尾处的单词边界\.

相关内容