2011-11-01 131 views
0

我有以下两个字符串正则表达式匹配字符串,但不是另一个

/signon/default.wl?rs=WLW11.10&vr=2.0&fn=_top 
/signon/default.wl?fn=%5Ftop&newdoor=true&rs=WLW11%2E10&vr=2%2 

我想匹配的项目除外的所有字符串不包含newdoor

到目前为止,我有以下的正则表达式

/signon/default.wl\?(?=[\w]*)(?!newdoor)

但它匹配所有字符串。 任何人都可以指出我做错了什么。

+0

哪种语言是您使用? –

+0

.net,但即时通讯测试http://gskinner.com/RegExr/ – Marcom

回答

5

你可以试试这个/signon/default.wl\?(?!.*newdoor).*

它声称使用负向前查找存在输入字符串没有newdoor发生。代码看起来像这样

resultString = Regex.Match(subjectString, @"/signon/default.wl\?(?!.*newdoor).*", 
       RegexOptions.IgnoreCase).Value; 
+0

这两个建议,工作,但我要与这个版本,因为我只需要测试字符串,而不是获取内容。 – Marcom

+0

+1,但请注意,您可以直接使用'Regex.IsMatch()'布尔值。另外,'Multiline'选项在这种情况下没有任何用处。 –

+0

@AlanMoore谢谢指出。删除了'Multiline'选项。 –

0
/signon/default.wl\?(?=[\w]*)(?!newdoor) 

两个(?=)(?!)是不消耗任何输入零宽度断言。尝试:

/signon/default.wl\?(.(?!newdoor))*$ 
+0

-1。在第一个正则表达式中,'(?= [\ w] *)'将始终成功,因为'[\ w] *'可以匹配零个字符;和'(?!newdoor)'只在'?'后面应用一次。第二个正则表达式不正确地匹配'/signon/default.wl?newdoor',因为在lookahead可以阻止它之前,该点消耗'newdoor'中的'n'。这是一种有效的技术,但是你应该在* lookahead之后放置点*:'(?:(?! newdoor)。)*'。 (我发现很多错误。) –

0

为什么不使用这样的:

subjectString.contains("newdoor"); 
相关问题