构建Javascript正则表达式,期望第一个字符大写,其余字符不区分大小写



我有一大堆工作技能,就像你在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标志给了我一些问题:

  • 它未能避免误报("React"the framework vs"React to"(
  • 一个作业可以有同一事物的多个大写字母(Reactjs/RectJS,Styled Components/Styled Components(

理想情况下,我的正则表达式应该只关心第一个字母的大写。我不知道如何用程序来做这件事。

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;

最新更新