查找未由其他字符串继续的字符串

时间:2014-12-10 00:39:24

标签: regex visual-studio-2012 regex-negation findall

我正在尝试为Visual Studio的Find All功能提供正确的Regex,但我真的很难过。我有以下字符串:

字符串A:

other.things.go.here.ClientTemplate("#= Namespace.sub.nope.method(data) #");

字符串B:

other.things.go.here.ClientTemplate("#= Namespace.sub.KeyPhrase.otherMethod(data) #");

字符串C:

other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.KeyPhrase.otherMethod(data) #");

此正则表达式只应与字符串A 匹配。以下是我认为可行的方法:

(ClientTemplate).*~(KeyPhrase)

我需要匹配一个包含“ClientTemplate”的字符串,而不是“KeyPhrase”。

编辑:我真的搞砸了这个。我的意思与我说的相反:

什么正则表达式只匹配字符串A

3 个答案:

答案 0 :(得分:2)

我认为你需要这样的模式

ClientTemplate.*KeyPhrase

Demo

或者,如果你想要KeyPhrase 后面的字符串,你可以使用像这样的负面预测

ClientTemplate(?!.*KeyPhrase.*$).*$

Demo

答案 1 :(得分:1)

编辑:这个问题对我有所了解,所以真正的答案就在底部。我离开了原版,因为它似乎不那么令人困惑,因为我认为即使正则表达式不是,所以大多数讨论仍然有用。


假设您在2013年之前的Visual Studio中使用了正则表达式(我知道您已对其进行了标记,但许多新用户在他们确实错误地添加visual-studio*标记时在他们的代码中谈论正则表达式),如果删除~,你的正则表达式似乎有效:

(ClientTemplate).*(KeyPhrase)

~(...)构造等同于negative lookahead。您说您希望匹配执行包含关键短语的行,因此您需要在正则表达式中包含,而不是排除它。 (这就是我删除代码的原因。)

但是,我会选择更具确定性的东西,比如:

ClientTemplate\("\#=[^"]*\.KeyPhrase\.[^"]*"\)

我在Visual Studio 2008中对此进行了测试,它匹配字符串B和C,但不匹配A.


编辑:毕竟这是一个否定任务。这是一个匹配字符串A并且不匹配字符串B和C的正则表达式:

<ClientTemplate\("\#= Namespace(\.~(KeyPhrase>):i)*\(data\) \#"\);

:i大致相当于\w+,这是传统的Perl派生词中的正则表达式。前瞻检查点后面的任何内容都不是KeyPhrase,而是允许:i>使用它。 <之前的ClientTemplate>以及KeyPhrase之后的:i是字边界;他们确保你只匹配整个单词。

答案 2 :(得分:0)

在名为&#39; my_file&#39;

的文件中考虑以下字符串
other.things.go.here.ClientTemplate("#= Namespace.sub.nope.method(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.nope.method(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.KeyPhrase.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.KeyPhrase.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.KeyPhraze.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.KeyPHRAZE.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.KeyPHR?ZE.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.keyphrase.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.keyphrase.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.slkjfiowe.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.dkjsehtw8.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.something.anything.11185.otherMethod(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.so...................

命令行

 grep  'other.things.go.here.ClientTemplate("#= Namespace.sub.nope.method(data) #");' '/root/Desktop/my_file' 

输出

other.things.go.here.ClientTemplate("#= Namespace.sub.nope.method(data) #");
other.things.go.here.ClientTemplate("#= Namespace.sub.nope.method(data) #");

命令行打印任何类似于字符串A的内容。

正则表达式可以是这样的

grep '^other.*go.here.ClientTemplate.*nope.method(data) #");' 'my_file'