我有很多工作技能,就像您可能在LinkedIn上看到的那样(“核物理”,“ Python”,“重型机械”等)。我也有一大段文字:职位描述。我正在尝试遍历列表,并确定文本块中存在哪些技能。这是我当前的代码:
// escape possible special characters in a string
// https://stackoverflow.com/questions/4371565/
const escapeRegExp = (s) => {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
let skills_in_job = {}
skills.forEach(skill => {
// Creating a regexp to search for all instances of <skill>
// \b means it is a standalone word (to prevent 'React' being in 'Reactive')
// 'g' means it will search globally (not just the first it finds)
// 'i' means it will be case insensitive
// Add word boundaries to make sure it is not a substring of a word
const rx = RegExp("\\b" + escapeRegExp(skill) + "\\b", 'gi')
const count = (job.match(rx) || []).length
if (count) skills_in_job[skill] = count
})
但是,该i
标志给了我一些问题:
理想情况下,我的正则表达式表达式只应关心首字母的大写。我不确定如何以编程方式执行此操作。
JavaScript正则表达式不支持内联修饰符((?i)
),也不支持修饰符组((?i:...)
)。
您可以按照Barmar建议的路径,从每个非首字母创建一个字符类,然后构建一个区分大小写的正则表达式:
skill = skill.replace(/\B./g, (x) => `[${x.toLowerCase()}${x.toUpperCase()}]`);
const rx = RegExp("\\b" + escapeRegExp(skill) + "\\b", 'g');
或者,您可以简单地过滤掉以第一个字母的不同大小写开头的匹配项
const rx = RegExp("\\b" + escapeRegExp(skill) + "\\b", 'gi')
const matches = (job.match(rx) || []).filter(x => x.charAt(0) == skill.charAt(0));
const count = (matches || []).length;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句