首页 > 解决方案 > 正则表达式正在接受带有符号的单词

问题描述

我有一种情况,我需要使用 Javascript Regex测试字符串是否包含特定的单词或字母。

示例字符串为:

// In the first 3 strings, I need "C" letter to be checked in the string
C is language is required.     
We need a C language dev.
Looking for a dev who knows C!

// Keyword is Artificial Intelligence
We need looking for someone who knows Artificial Intelligence.

为了检查上述内容,我创建了一个正则表达式。

['C', 'Artificial Intelligence', 'D', 'Angular', 'JS'].forEach((item) => {
 const baseRex = /[!,.?": ]?/g;
 const finalRex = new RegExp(baseRex.source + item + baseRex.source); // /[!,.?": ]<C/D/Angular...>[!,.?": ]/

// Say checking for first iteration only. So let consider 'C'.
 console.log(finalRex.test('C is required')); // true
 console.log(finalRex.test('Looking for a dev who knows C!')); // true
 console.log(finalRex.test('We need a C language dev.')); // true
 console.log(finalRex.test('Computer needed')); // Also returns true | Which is wrong!

});

我不希望包含字母 C 的单词也得到计数。

标签: javascriptregex

解决方案


与连接后的正则表达式baseRex是:

[!,.?": ]?C[!,.?": ]?

请注意,[!,.?": ]?可以匹配 0 或 1 个字符。在Computer中,两个子模式都[!,.?": ]?匹配 0 个字符,并且都C匹配C,导致整个正则表达式匹配。

据推测,您在?那里添加了它以便它在字符串的开头和结尾工作,那里没有要匹配的字符。但是,您应该改用^and$作为开始和结束。你的整个正则表达式应该是:

(?:[!,.?": ]|^)C(?:[!,.?": ]|$)

您还可以将字符类替换为\W,这意味着[^0-9a-zA-Z_]

事实上,你实际上不需要做所有这些!有一个有用的 0 宽度匹配器,称为 "word-boundary" \b,这似乎正是您想要的。您的基本正则表达式可以是:

\b

它只匹配 a\w和 a\W或 a\W和a 之间的边界\w


推荐阅读