由于这篇文章Regex find word in the string
,我非常接近解决这个问题但我仍然不是100%。
如果我将此正则表达式与Apache的 BrowserMatchNoCase
一起使用^(.*?)(\b360Spider\b)(.*)$
我得到以下结果:
我需要它来匹配单词360Spider,无论前面或后面放置什么,所以NOT360Spider应该是匹配。
在此先感谢,多年来我的正则表达式有所改善,但我仍然无法完全理解让事情变得完美而不会导致误报。
与此同时,我不想引入其他误报,这就是为什么我首先钻研这个,所以其他用户代理名称喜欢“Exabot”和“Alexabot”我不想要“exabot” “Alexabot的一部分被发现。
所以让我们在另一个例子中说:
^(.*?)(\bExabot\b)(.*)$
我得到以下结果:
如果我删除字边界“\ b”,如下所示:
^(.*?)(Exabot)(.*)$
我得到以下结果:
所以我想我必须坚持使用单词boundary“\ b”,现在的诀窍是让printf将“\ b”写入我的字符串而不是将其视为退格字符。
答案 0 :(得分:1)
请注意,一旦您在360Spider
周围添加字词边界,就无法在另一个字词内匹配,并附有数字或甚至_
符号,这些符号也被视为字词字符。
如果您需要在字符串中的任何位置匹配单词,则需要删除单词边界\b
。但是,根据您的示例判断,您仍然需要单词边界,否则您将匹配exabot
中的Alexabot
。
这是一种在Bash中定义模式的方法:
#!/bin/bash
line='var_here'
printf "BrowserMatchNoCase \"^(.*?)(\\\b${line}\\\b)(.*)\$\" good_bot\n"
查看online demo。请注意,在插值字符串文字内转义$
是个好主意。