Regex Apache精确匹配字符串中的单词

Regex Apache精确匹配字符串中的单词,regex,apache,Regex,Apache,多亏了这篇文章,我很快就能解决这个问题了 但我仍然不是100%在那里 如果我将这个正则表达式与Apache的BrowserMatchNoCase一起使用 ^(.*?)(\b360Spider\b)(.*)$ 我得到以下结果: 360Spider=匹配 360spider=匹配 360SpIdEr=匹配 不匹配 Not360Spider=不匹配 不匹配 不匹配 我需要它来匹配单词360Spider,不管单词的前面或后面是什么,所以NOT360Spider应该是匹配的 提前感谢,我的正则表达式

多亏了这篇文章,我很快就能解决这个问题了

但我仍然不是100%在那里

如果我将这个正则表达式与Apache的BrowserMatchNoCase一起使用

^(.*?)(\b360Spider\b)(.*)$
我得到以下结果:

  • 360Spider=匹配
  • 360spider=匹配
  • 360SpIdEr=匹配
  • 不匹配
  • Not360Spider=不匹配
  • 不匹配
  • 不匹配
我需要它来匹配单词360Spider,不管单词的前面或后面是什么,所以NOT360Spider应该是匹配的

提前感谢,我的正则表达式在过去几年中有所改进,但我仍然无法完全理解如何在不导致误报的情况下实现完美

同时,我不想引入其他误报,这就是为什么我首先要深入研究这个问题,所以其他用户代理名称,如“Exabot”和“Alexabot”,我不希望Alexabot的“Exabot”部分被检测到

让我们再举一个例子:

^(.*?)(\bExabot\b)(.*)$
我得到以下结果:

  • Alexabot=不匹配
  • Exabot=匹配
  • exAbot=匹配
如果我删除单词边界“\b”,如下所示:

^(.*?)(Exabot)(.*)$
我得到以下结果:

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

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

注意,一旦在
360Spider
周围添加单词边界,就无法在另一个单词中匹配它,用数字或甚至
\u
符号包围,这些符号也被视为单词字符

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

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

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

看一看。注意,最好在插入的字符串文本中转义
$

删除单词边界
\b
。顺便问一下,它也将匹配
360spiders
。这可能吗不,不可能理解你在问什么。显然不可能将
exabot
^(.*)(\b360Spider\b)(.*)$
匹配。感谢各位,我用更多的例子更新了我的问题,似乎我必须坚持使用
\b
单词边界以常规字符串文字定义文字
\
,通常需要放置双反斜杠。如果您在某个文本文件中定义一个模式,然后由引擎读入并解析,则不必这样做。感谢我在bash脚本
printf“BrowserMatchNoCase\”^(.*)(\\\b${line}\\\\\b)(.*)$“good\u bot\n”
中找到了printf语法,我可以理解为什么转义printf字符串中的最后一个$很重要。事实上,我被词语的界限所束缚,没有它们,整个世界都是误报。这个新的正则表达式现在100%工作。奇怪的是,
-
被边界这个词忽略了。@MitchellK:不客气。如果您需要调整单词边界,可以随意删除一行<代码>-不被单词边界忽略,单词边界存在于
a
-
之间,存在于
-
a
之间,但不存在于
之间
-
。再次感谢Wiktor,你是个明星。我将更新我原来的问题,使之更像一个问题和答案。