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