我需要在任意位置匹配不包含关键字的字符串
Posted
技术标签:
【中文标题】我需要在任意位置匹配不包含关键字的字符串【英文标题】:I need to match strings that don't contain a keyword at an arbitrary position 【发布时间】:2011-03-19 23:58:08 【问题描述】:我需要匹配不在任意位置包含关键字 (beta2
) 的字符串。
考虑:
var aStr = [
'/beta1/foo',
'beta1/foo',
'/beta1_xyz/foo',
'blahBlah/beta1/foo',
'beta1',
'/beta2/foo',
'beta2/foo',
'/beta2_xyz/foo',
'blahBlah/beta2/foo',
'beta2',
'/beat2/foo',
'beat2/foo',
'/beat2_xyz/foo',
'blahBlah/beat2/foo',
'beat2'
];
function bTestForMatch (Str)
return /.*\b(?!beta2).*/i.test (Str);
for (var J=0, iLen=aStr.length; J < iLen; J++)
console.log (J, bTestForMatch (aStr[J]), aStr[J]);
我们需要一个匹配所有排除beta2
的字符串的正则表达式。 beta2
将始终从单词边界开始,但不一定以一个结尾。它可以在字符串中的多个位置。
期望的结果是:
0 true /beta1/foo
1 true beta1/foo
2 true /beta1_xyz/foo
3 true blahBlah/beta1/foo
4 true beta1
5 false /beta2/foo
6 false beta2/foo
7 false /beta2_xyz/foo
8 false blahBlah/beta2/foo
9 false beta2
10 true /beat2/foo
11 true beat2/foo
12 true /beat2_xyz/foo
13 true blahBlah/beat2/foo
14 true beat2
正则表达式适用于第三方分析工具,它采用 javascript 正则表达式来过滤子结果。该工具采用单行正则表达式。没有 API,我们无权访问其源代码。
是否有一个 JavaScript 正则表达式可以从此分析运行中过滤第二个 beta 结果 (beta2
)?
【问题讨论】:
【参考方案1】:试试
/^(?!.*beta2).*$/
【讨论】:
也许你想用\b
锚点包围关键字,以避免像beta20
或alphabeta2
这样的词出现误报。
@Tim: 前面可能有一个\b
,但是由于案例7,它不能出现在后面(需要更复杂的东西,比如(?![^a-z])
)。
@KennyTM:是的,我没有注意到案例 7。那时我建议(?![^\W_])
。但是正则表达式变得非常丑陋:/^(?!.*(?<![^\W_])beta2(?![^\W_])).*$/
JavaScript 不支持lookbehinds。无论如何,我认为你让这变得比它需要的更复杂。我会用\b
锚定前端,但我不确定它是否真的需要。至于后端,我不会费心去锚定它。关于它的唯一信息是负面的:它不一定会落在单词边界上。
如问题中所述,beta2
始终开始在单词边界上。也可以混合大小写。所以我们稍微调整了这个解决方案:/^(?!.*\bbeta2).*$/i
。谢谢大家。【参考方案2】:
这算作弊吗?
return !/beta2/i.test (Str);
【讨论】:
这不起作用,因为!
运算符在正则表达式之外。我们试过了;除了纯正则表达式之外的任何工具都会出错。
=) 它之所以有效,是因为 !在正则表达式之外(bTestForMatch 返回您想要的内容)。然而,KennyTM 的正则表达式似乎正是您所要求的。以上是关于我需要在任意位置匹配不包含关键字的字符串的主要内容,如果未能解决你的问题,请参考以下文章