javascript - 使用正则表达式分隔单词

标签 javascript regex split

我试图得到这个结果:“夏天来了”。为什么下面的代码会生成额外的空格? (当前结果:“-夏天--是- -这里-”)。

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/

相关文章:

regex - 将固定长度 block 与可变长度元素匹配的正则表达式

java - 从 pdf 文件中提取文本

javascript - 将模块模式 javascript 代码拆分为文件

Python - 解析、分割文本并将其分成单独的行

java - 用多个空格分割字符串

IF 语句中的 JavaScript 字符串输出

javascript - 使用 jquery 遍历 jsonp

javascript - 水平 CSS 漏斗

javascript - 正则表达式拒绝以点以外的非字母结尾的名称

c++ - 使用正则表达式验证输入