2017-06-26 27 views
1

我非常接近解决这个感谢这个帖子Regex find word in the string阿帕奇完全匹配的Word里面字符串

但我现在还不能100%存在。

如果我用这个正则表达式与Apache的BrowserMatchNoCase沿

^(.*?)(\b360Spider\b)(.*)$ 

我得到如下结果:

  • 360Spider =匹配
  • 360spider =匹配
  • 360SpIdEr =匹配
  • 360spiders =不匹配
  • Not360Spider =敌不过
  • Not360Spider =匹配
  • 不-360spider =匹配

我需要它,不管是什么放在前面或单词后面的词360Spider匹配,所以NOT360Spider应该是一场比赛。

在此先感谢,我的正则表达式多年来有所改善,但我仍然无法完全理解让事情完美而不会导致误报。

同时我不想介绍其他误报,这就是为什么我首先深入研究这个问题,所以其他用户代理名称喜欢“Exabot”和“Alexabot”我不想让“ exabot“部分Alexabot被检测到。

所以,让我们在另一个例子说:

^(.*?)(\bExabot\b)(.*)$ 

我得到如下结果:

  • Alexabot =敌不过
  • Exabot =匹配
  • exAbot =匹配

如果我删除单词边界“\ B” 如下:

^(.*?)(Exabot)(.*)$ 

我得到如下结果:

  • Alexabot =匹配
  • Exabot =匹配
  • exAbot =匹配
  • anythingExabot =匹配

所以我想我必须坚持单词边界“\ b “现在的技巧是让printf将”\ b“写入我的字符串中,而不是将其视为退格字符。

+1

删除单词边界'\ b'。顺便说一下,它也会匹配'360spiderrs'。 –

+0

*这甚至可能吗?* - 不,不可能理解你在问什么。 “'exabot”与'^(。*?)(\ b360Spider \ b)(。*)$'匹配肯定是不可能的。 –

+0

谢谢你们,我用更多的例子更新了我的问题,似乎我必须坚持使用'\ b'的单词边界 – MitchellK

回答

1

请注意,一旦围绕360Spider添加了单词边界,您就无法在另一个单词中将其与其他单词相匹配,这些单词中包含数字或甚至被认为是单词字符的符号。

如果您需要匹配字符串内的任何字,您需要删除字边界\b。然而,根据您的示例来判断,您仍然需要字边界,否则您将在Alexabot中匹配exabot

这是一种方式,猛砸来定义你的模式:

#!/bin/bash 
line='var_here' 
printf "BrowserMatchNoCase \"^(.*?)(\\\b${line}\\\b)(.*)\$\" good_bot\n" 

看到online demo。请注意,在插入的字符串文字中跳出$是个好主意。

+0

谢谢Wiktor,我可以看到为什么转义printf字符串中的最后$是很重要的。事实上,我受到了词界限的限制,没有它们,只有整个世界的误报。这个新的正则表达式现在正在工作100%。奇怪的是,'-'被字边界忽略。 – MitchellK

+0

@MitchellK:不客气。如果您需要调整字边界,请随时放下一行。 '-'不被字边界忽略,字边界存在于''''和'a'之间的'a'和'-'之间,但不在';'和'-'之间。 –

+0

再次感谢Wiktor,你是明星。我会更新我的原始问题,成为更多的问题和答案。 – MitchellK