我正在尝试为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”。
编辑:我真的搞砸了这个。我的意思与我说的相反:答案 0 :(得分:2)
我认为你需要这样的模式
ClientTemplate.*KeyPhrase
或者,如果你想要KeyPhrase
后面的字符串,你可以使用像这样的负面预测
ClientTemplate(?!.*KeyPhrase.*$).*$
答案 1 :(得分:1)
假设您在2013年之前的Visual Studio中使用了正则表达式(我知道您已对其进行了标记visual-studio-2012,但许多新用户在他们确实错误地添加visual-studio*
标记时在他们的代码中谈论正则表达式),如果删除~
,你的正则表达式似乎有效:
(ClientTemplate).*(KeyPhrase)
~(...)
构造等同于negative lookahead。您说您希望匹配执行包含关键短语的行,因此您需要在正则表达式中包含,而不是排除它。 (这就是我删除regex-negation代码的原因。)
但是,我会选择更具确定性的东西,比如:
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'