正则表达式 - 在字符串中的任何位置都不包含某个字符串

时间:2017-05-04 11:33:29

标签: regex expression

我希望这不是重复的,我一直在搜索几个小时的注册答案,所以我不这么认为!

有没有一种方法可以用正则表达式进行搜索,说结果必须不包含单词' bot'字符串中的任何地方?

我在其他地方使用负面预测,但问题是我不知道“机器人”这个词在哪里?可能会出现。它可能是一个较长单词的一部分,它可能出现在开头,结尾或两者之间!我希望包含与表达式其余部分匹配的结果,但也要排除' bot'。

这是我目前的搜索表达式:

2017-0[2-5] (.*) (UserInfo.aspx UID=111 80 -)=(?!10. *)+. * 

我搜索的结果通常如下:

2017-02-16 15:56:00 10.3.1.17 GET /UserInfo.aspx UID=111 80 - 157.85.39.17 Mozilla/5.0+(compatible;+bingbot/2.0;++http://www.bing.com/bingbot.htm) 200 0 0 390

理想情况下,我希望将此结果排除在外,因为它包含' bot'即使它仍然符合我的RegEx的第一部分。

1 个答案:

答案 0 :(得分:0)

如果可能的话,将其作为两个步骤实现。例如,如果这是在脚本中,则进行两次检查:一次检查一行是否包含bot,然后是第二步如果机器人不存在,则执行现有的正则表达式。

将复杂的匹配要求分解为多个测试通常是个好主意。它可以产生更清晰的代码,也可以更高效,特别是如果早期的检查很简单。

单独断开此步骤还允许您使用更简单的正匹配而不是否定匹配。

伪代码示例:

if (!string.contains('/bot/') and string.contains('/yourpatternhere/'))
{
    do stuff
}

如果您只能使用单个正则表达式,只需在字符串的开头使用否定前瞻:

(?!^.*bot)2017-0[2-5] (.*) (UserInfo.aspx UID=111 80 -)=(?!10. *)+. * 

(我在这里忽略了正则表达式的任何其他可能的问题,这看起来不太正确......)