我需要在任意位置匹配不包含关键字的字符串

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锚点包围关键字,以避免像beta20alphabeta2这样的词出现误报。 @Tim: 前面可能有一个\b,但是由于案例7,它不能出现在后面(需要更复杂的东西,比如(?![^a-z]))。 @KennyTM:是的,我没有注意到案例 7。那时我建议(?![^\W_])。但是正则表达式变得非常丑陋:/^(?!.*(?&lt;![^\W_])beta2(?![^\W_])).*$/ JavaScript 不支持lookbehinds。无论如何,我认为你让这变得比它需要的更复杂。我会用\b 锚定前端,但我不确定它是否真的需要。至于后端,我不会费心去锚定它。关于它的唯一信息是负面的:它不一定会落在单词边界上。 如问题中所述,beta2 始终开始在单词边界上。也可以混合大小写。所以我们稍微调整了这个解决方案:/^(?!.*\bbeta2).*$/i。谢谢大家。【参考方案2】:

这算作弊吗?

return !/beta2/i.test (Str);

【讨论】:

这不起作用,因为 ! 运算符在正则表达式之外。我们试过了;除了纯正则表达式之外的任何工具都会出错。 =) 它之所以有效,是因为 !在正则表达式之外(bTestForMatch 返回您想要的内容)。然而,KennyTM 的正则表达式似乎正是您所要求的。

以上是关于我需要在任意位置匹配不包含关键字的字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的escape的用法

MySQL模糊查询特殊字符如何查询

正则表达式中,如何在任意匹配字符后面加上原字符和特定内容

在任意位置为stringbuffer 添加内容

手把手实现双链表

正则匹配修饰符