用正则表达式分隔单词

时间:2015-07-07 02:19:53

标签: javascript regex split

我想要得到这样的结果:' Summer-is-here'。为什么下面的代码会产生额外的空间? (目前的结果:' -Summer - Is- -Here - ')。

function spinalCase(str) {
  var newA = str.split(/([A-Z][a-z]*)/).join("-");
  return newA;
}

spinalCase("SummerIs Here");

4 个答案:

答案 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用短划线替换下划线。这完全有效,除了它使字符串中的第一个单词小写。您可以使用

将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