所需区域的分词

时间:2017-03-07 13:35:28

标签: javascript regex

我遇到了一个案例,我需要将每个单词String拆分为驼峰案例。我正在使用这种模式实现类似于answer this question的拆分过程:

split(/(?=[A-Z])/)

在遇到这个测试集之前,一切都很好:

  • SalaryGrade - 薪资等级
  • ParentChild - Parent Child
  • 维护 - 维护
  • 汇款SPD - 汇款S P D
  • FBIAgent - F B I代理
  • FBIAgentNYDepartment - F B I Agent N Y Department

最多三个工作正常,但四到六个应该是"汇款SPD"," FBI代理"," FBI代理纽约部门"分别

如何以这样的方式选择区域:它将连续的大写字母视为一个单词而最后一个顺序作为下一个单词的开头?我并不喜欢单行的正则表达式,说实话,我失去了所有的希望。我计划在这里执行强力循环,如果不仅仅是关于该性能。

编辑:我希望这两个带有非成功大写字母的单词和那些带有大写字母的单词对这个函数感到满意,这与此网站上有关分割字符串的其他问题不同。

2 个答案:

答案 0 :(得分:2)

您可以在此处使用匹配方法:

str.match(/[A-Z]+(?![a-z])|[A-Z][a-z]*/g)

请参阅regex demo

<强>详情:

  • [A-Z]+(?![a-z]) - 1+大写ASCII字母后面没有小写ASCII字母
  • | - 或
  • [A-Z][a-z]* - 大写的ASCII字母后跟0 +小写ASCII字母

&#13;
&#13;
var ss = ['SalaryGrade','ParentChild','Maintenance','RemittanceSPD','FBIAgent','FBIAgentNYDepartment'];
var rx = /[A-Z]+(?![a-z])|[A-Z][a-z]*/g; 
for (var s = 0; s < ss.length; s++) { 
  console.log("Testing: ", ss[s], "... ");
  console.log("Matched: ", JSON.stringify(ss[s].match(rx)));
}
&#13;
&#13;
&#13;

请注意,如果是FBIAgentFBI只会与[A-Z]+(?![a-z])匹配,因为在正则表达式引擎抓取FBIA大写字母后会触发回溯[A-Z]+:它回溯到大写字母后面没有小写字母的位置,因此,您得到FBI匹配,并且A字母仍然在下一次迭代时被消耗

答案 1 :(得分:-1)

以下内容应该有所帮助:

/(?=[A-Z][a-z])/