javascript - 正则表达式正在接受带有符号的单词
问题描述
我有一种情况,我需要使用 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 的单词也得到计数。
解决方案
与连接后的正则表达式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
。
推荐阅读
- amazon-web-services - 从超过 X 天的 S3 存储桶中删除文件夹、子文件夹和所有文件
- apache-spark - 将 Hive 存储与 Spark 集群(计算层)分离
- r - 如何使用 If-else?
- postman - 在 Postman 测试脚本中验证响应
- mysql - 使用 Prisma 执行 MySQL 查询耗时过长
- pdf - 我如何在java中使用apache poi和itext 7和pdf calligraph将docx转换为pdf?
- c# - 如何从 WW 对象生成 CSV 文件?
- css - 使用 1kb .png 图像作为背景图像(重复时)是否可行?
- node.js - 如何确定已编译本机模块的 ABI 版本(和其他详细信息)?
- android - 是否可以在 android 设备上让用户看到 3 个或更多应用程序?