我想要得到这样的结果:' Summer-is-here'。为什么下面的代码会产生额外的空间? (目前的结果:' -Summer - Is- -Here - ')。
function spinalCase(str) {
var newA = str.split(/([A-Z][a-z]*)/).join("-");
return newA;
}
spinalCase("SummerIs Here");
答案 0 :(得分:1)
您正在使用各种split
,其中regexp包含一个捕获组(括号内),它具有特定含义,即包含结果中的所有拆分字符串。所以你的结果就变成了:
["", "Summer", "", "Is", " ", "Here", ""]
将其加入-
会为您提供结果。但是你不能只从正则表达式中删除不必要的捕获组,因为那时拆分会给你
["", "", " ", ""]
因为正在使用正则表达式中的*
分割零宽度字符串。所以这不起作用。
如果您想使用split
,请尝试将零宽度或仅限空格匹配向前看分割为大写字母:
> "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
用短划线替换下划线。这完全有效,除了它使字符串中的第一个单词小写。您可以使用
var SPINALIZE_REGEXP = /([a-z\d])\s*([A-Z])/g;
function spinalCase(str) {
return str.replace(SPINALIZE_REGEXP, '$1-$2').toLowerCase();
}
答案 1 :(得分:1)
您想要将大写单词分开,但是您试图将大写单词上的字符串拆分,这就是为什么您获得那些空字符串和空格。
我认为你正在寻找这个:
var newA = str.match(/[A-Z][a-z]*/g).join("-");
答案 2 :(得分:0)
([A-Z][a-z]*) *(?!$|[a-z])
您只需按$1-
进行替换即可。请参阅演示。
https://regex101.com/r/nL7aZ2/1
var re = /([A-Z][a-z]*) *(?!$|[a-z])/g;
var str = 'SummerIs Here';
var subst = '$1-';
var result = str.replace(re, subst);
答案 3 :(得分:0)
var newA = str.split(/ |(?=[A-Z])/).join("-");
您可以更改正则表达式:
/ |(?=[A-Z])/ or /\s*(?=[A-Z])/
结果:
Summer-Is-Here