我试图得到这个结果:“夏天来了”。为什么下面的代码会生成额外的空格? (当前结果:“-夏天--是- -这里-”)。
function spinalCase(str) {
var newA = str.split(/([A-Z][a-z]*)/).join("-");
return newA;
}
spinalCase("SummerIs Here");
最佳答案
您正在使用各种split
,其中正则表达式包含一个捕获组(括号内),它具有特定含义,即在结果中包含所有拆分字符串。所以你的结果就变成了:
["", "Summer", "", "Is", " ", "Here", ""]
将其与 -
连接即可得到您所看到的结果。但是您不能只从正则表达式中删除不必要的捕获组,因为这样拆分会给您
["", "", " ", ""]
因为您正在分割零宽度字符串,由于正则表达式中的 *
。所以这实际上不起作用。
如果您想使用分割
,请尝试分割零宽度或仅空格的匹配向前的大写字母:
> "SummerIs Here".split(/\s*(?=[A-Z])/)
^^^^^^^^^ LOOK-AHEAD
< ["Summer", "Is", "Here"]
现在你可以加入它来获得你想要的结果,但没有小写映射,你可以这样做:
"SummerIs Here" .
split(/\s*(?=[A-Z])/) .
map(function(elt, i) { return i ? elt.toLowerCase() : elt; }) .
join('-')
这会给你想要的东西。
按照另一个答案中的建议使用replace
也是一个完全可行的解决方案。就最佳实践而言,请考虑 Ember 中的以下代码:
var DECAMELIZE_REGEXP = /([a-z\d])([A-Z])/g;
var DASHERIZE_REGEXP = /[ _]/g;
function decamelize(str) {
return str.replace(DECAMELIZE_REGEXP, '$1_$2').toLowerCase();
}
function dasherize(str) {
return decamelize(str).replace(DASHERIZE_REGEXP, '-');
}
首先,decamelize
在小写字母(或数字)和大写字母的两个字符序列之间添加下划线 _
。然后,dasherize
将下划线替换为破折号。除了将字符串中的第一个单词小写之外,这工作得很好。您可以在此处将 decamelize 和 dasherize 与
var SPINALIZE_REGEXP = /([a-z\d])\s*([A-Z])/g;
function spinalCase(str) {
return str.replace(SPINALIZE_REGEXP, '$1-$2').toLowerCase();
}
关于javascript - 使用正则表达式分隔单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31258701/