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

构建期望第一个字符大写的Javascript正则表达式,其余字符不区分大小写,javascript,regex,Javascript,Regex,我有一大堆工作技能,就像你在LinkedIn上看到的(“核物理”、“Python”、“重型机械”等)。我还有一大段文字:工作描述。我试图遍历列表,并确定文本块中存在哪些技能。这是我目前的代码: //转义字符串中可能的特殊字符 // https://stackoverflow.com/questions/4371565/ const escapeRegExp=(s)=>{ 返回s.replace(/[-/\^$*+?.()\[\]{}]/g,'\\$&')) } 让技能在工作中={} 技能。for

我有一大堆工作技能,就像你在LinkedIn上看到的(“核物理”、“Python”、“重型机械”等)。我还有一大段文字:工作描述。我试图遍历列表,并确定文本块中存在哪些技能。这是我目前的代码:

//转义字符串中可能的特殊字符
// https://stackoverflow.com/questions/4371565/
const escapeRegExp=(s)=>{
返回s.replace(/[-/\^$*+?.()\[\]{}]/g,'\\$&'))
}
让技能在工作中={}
技能。forEach(技能=>{
//创建regexp以搜索的所有实例
//\b表示它是一个独立的单词(防止'React'处于'Reactive'状态)
//“g”表示它将进行全局搜索(而不仅仅是第一次找到)
//“i”表示不区分大小写
//添加单词边界以确保它不是单词的子字符串
const rx=RegExp(“\\b”+escapeRegExp(技能)+”\\b“,gi”)
常量计数=(job.match(rx)| |[])长度
如果(计数)工作中的技能[技能]=计数
})
但是,
i
标志给了我一些问题:

  • 它无法避免误报(“反应”框架与“反应到”)
  • 一个作业可以有同一事物的多个大写形式(Reactjs/Reactjs,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;

我认为没有一种方法可以在JS中定义一个只部分不区分大小写的regexp。这可以通过PCRE在不敏感部分之前使用
(?i)
,但这在JS中不起作用。因此,您需要将关键字更改为
R[Ee][Aa][Cc][Tt]
正则表达式可能不适合这样的自然语言处理工具。
函数ucfirst(string){const s=string.split(“”),f=s.shift().toUpperCase();返回f+s.join(“”);}
谢谢,巴尔马。如果我的用例变得更复杂,我将使用javascript研究NLP。哇,给出的建议远远超出了我的预期。我想现在我将坚持使用简单的首字母检查(非常优雅),但我欣赏它背后的思维过程概述。