2009-11-25 72 views

回答

1

你会使用Negative lookarounds,但表达的是非常复杂的,如果你不知道这个词的预期位置(甚至顺序)。 你知道订单或模式?

否则我建议你使用另一种工具,它可以很容易地环(或列表COMP)通过文件里逐行做INSTR或包含或其他简单,更快,逻辑测试...

+0

没有模式为我的情况,我想。我很惊讶这个简单的问题对于正则表达式非常棘手。 – Ricky 2009-11-25 07:24:49

+0

问题是表达逻辑 – annakata 2009-11-25 20:10:56

23

对于Visual Studio 2012(以及更高版本):

^(?!.*strB).*strA.*$ 

说明:

^   # Anchor the search at the start of the line 
(?!.*strB) # Make sure that strB isn't on the current line 
.*strA.* # Match the entire line if it contains strA 
$   # Anchor the search to the end of the line 

你可能想在正则表达式的末尾添加(?:\r\n)?如果你也想删除回车/行与行的其余部分饲料一起。

+5

这工作。我不得不扩展到支持排除多个字符串,这可以解释为例如。 '^(?!* STRB)(?!。* STRC)(?!。* STRD)。* STRA。* $'。 – DuckMaestro 2015-11-25 02:59:21

1

我要去承担搜索框实际上接受一般的正则表达式。使用负前瞻:

(?!^.*strB.*$)strA 

你需要设置多选项(^$比赛在开始的线/结束)。如果无法使用对话框选项进行设置,请尝试:

(?m)(?!^.*strB.*$)strA 

这可能是该引擎中的默认模式。

+0

你需要锚定整个正则表达式,而不仅仅是前瞻。这意味着在'strA'前面放置'^'*在lookahead之外并添加另一个'。*'。但是,不需要将正则表达式的任何部分定位到该行的* end *(即'。* $'可以去)。 – 2010-02-06 12:10:05

+0

嗯,我不知道。当我现在看它时,我将它写为“如果一行不包含strB,则匹配strA”。对我来说似乎是正确的,因为我们一行一行地匹配。我认为。阅读旧的正则表达式会让我的大脑受伤。 – wds 2010-02-06 12:36:20

16

对于Visual Studio 2010(和以前的版本):

Visual Studio的搜索框有正则表达式的语法自己的,离奇的版本。这个作品表达的要求:

^~(.*strB).*strA 

^一行的开头匹配。 (通常对于文本编辑器,不存在“多行”选项; ^$总是在行边界处匹配。)

.匹配除换行符以外的任何字符。 (通常情况下,似乎没有让单点匹配换行符的“单行”或“点全部”模式。)

~(...)是“防止匹配”构造,等效(据我所知)由另一个反应中使用的负先行((?!...))。

+4

仅供参考,从Visual Studio 2012开始,dotNet正则表达式引擎现在用于搜索,因此奇怪的语法现在应该消失。很好的答案,但只知道你使用的VS版本。 – redcalx 2013-09-18 13:59:54

+0

在Visual Studio 2010 SP1Rel中测试时,如果“strB”可能在“strA”后面,则必须修改此答案。尝试'^〜(。* strB)。* strA〜(。* strB)'。或'〜(strB)。* strA。*〜(strB)'。 – ToolmakerSteve 2017-09-12 18:37:44

0

这为我工作与Visual Studio 2010:

^+ ^(STRB)] +(STRA)+ [^(STRB)] + $

相关问题