Apache精确匹配单词内部字符串

时间:2017-06-26 09:50:51

标签: regex apache

由于这篇文章Regex find word in the string

,我非常接近解决这个问题

但我仍然不是100%。

如果我将此正则表达式与Apache的 BrowserMatchNoCase

一起使用
^(.*?)(\b360Spider\b)(.*)$

我得到以下结果:

  • 360Spider = match
  • 360spider = match
  • 360SpIdEr =匹配
  • 360spiders =不匹配
  • Not360Spider =不匹配
  • Not-360Spider = match
  • Not-360spider = match

我需要它来匹配单词360Spider,无论前面或后面放置什么,所以NOT360Spider应该是匹配。

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

与此同时,我不想引入其他误报,这就是为什么我首先钻研这个,所以其他用户代理名称喜欢“Exabot”和“Alexabot”我不想要“exabot” “Alexabot的一部分被发现。

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

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

我得到以下结果:

  • Alexabot =不匹配
  • Exabot =匹配
  • exAbot = match

如果我删除字边界“\ b”,如下所示:

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

我得到以下结果:

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

所以我想我必须坚持使用单词boundary“\ b”,现在的诀窍是让printf将“\ b”写入我的字符串而不是将其视为退格字符。

1 个答案:

答案 0 :(得分:1)

请注意,一旦您在360Spider周围添加字词边界,就无法在另一个字词内匹配,并附有数字或甚至_符号,这些符号也被视为字词字符。

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

这是一种在Bash中定义模式的方法:

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

查看online demo。请注意,在插值字符串文字内转义$是个好主意。