Javascript 将句子或大小写转换为大小写

Javascript 将句子或大小写转换为大小写,javascript,regex,Javascript,Regex,我试着把句子格和驼峰格都转换成脊柱格 通过在每个大写字母前添加空格,我可以将camel大小写改为,但当我将其应用于空格后带有大写字母的句子时,我得到了额外的空格 以下是我目前的功能: function spinalCase(str) { var noCamel = str.replace(/([A-Z])/g, ' $1'); var newStr = noCamel.replace(/\s|_/g, "-"); return newStr.toLowerCase();

我试着把句子格和驼峰格都转换成脊柱格

通过在每个大写字母前添加空格,我可以将camel大小写改为,但当我将其应用于空格后带有大写字母的句子时,我得到了额外的空格

以下是我目前的功能:

function spinalCase(str) {
    var noCamel = str.replace(/([A-Z])/g, ' $1');
    var newStr = noCamel.replace(/\s|_/g, "-");
    return newStr.toLowerCase();
}

spinalCase("makeThisSpinal"); //returns make-this-spinal
spinalCase("Make This Spinal"); //returns -make--this--spinal

这是因为你用空格及其小写字母替换了所有大写字母。在你的句子中,
this
spinal
前面有两个空格

您可以做的是将所有大写字母替换为
“-$1”
,然后删除字符串中的所有空格。

获取lodash,特别是

而不是:

var noCamel = str.replace(/([A-Z])/g, ' $1');
尝试:

函数spinalCase(str){
var noCamel=str.replace(/([a-z](?=[a-z]))/g,“$1”)
var newStr=noCamel.replace(/\s | g/g,“-”);
return newStr.toLowerCase();
}
菠菜酶(makethispinalcase)//这是我的脊骨
脊柱酶(“使其成为脊柱”)//返回-使这个脊椎

不要使用str.replace(/([A-Z])/g,$1')进行驼峰大小写拆分,而应该使用
str.replace(/([A-Z](?=[A-Z]))/g,$1')
,无论大小写,它都会将每个单词隔开。

这是我的解决方案,也许你会发现它是一个很好的参考:

function spinalCase(str) {
  var newStr = str[0];

  for (var j = 1; j < str.length; j++) {
    // if not a letter make a dash
    if (str[j].search(/\W/) !== -1 || str[j] === "_") {
      newStr += "-";
    }
    // if a Capital letter is found 
    else if (str[j] === str[j].toUpperCase()) {
      // and preceded by a letter or '_'
      if (str[j-1].search(/\w/) !== -1 && str[j-1] !== "_") {
        // insert '-' and carry on
        newStr += "-";
        newStr += str[j];
      }
      else {
        newStr += str[j];
      }
    }
    else {
        newStr += str[j];
    }
  }

  newStr = newStr.toLowerCase();
  return newStr;
}
函数spinalCase(str){
var newStr=str[0];
对于(var j=1;j
您能否再突出一些示例,说明您希望该函数做什么?将第二个示例视为您想要的东西而不是您试图避免的东西时,我感到困惑。您可以使用-var newStr=noCamel.replace(/\s+|u+/g,“-”)代替您的var newStr;它将省去额外的空格,但您必须考虑“特殊情况”,如OP:\B“匹配零宽度非单词边界,如两个字母之间或两个空格之间。”的第一个单词中的大写字母作为参考。请参阅:
var noCamel = str.replace(/(\B[A-Z])/g, ' $1');
function spinalCase(str) {
  var newStr = str[0];

  for (var j = 1; j < str.length; j++) {
    // if not a letter make a dash
    if (str[j].search(/\W/) !== -1 || str[j] === "_") {
      newStr += "-";
    }
    // if a Capital letter is found 
    else if (str[j] === str[j].toUpperCase()) {
      // and preceded by a letter or '_'
      if (str[j-1].search(/\w/) !== -1 && str[j-1] !== "_") {
        // insert '-' and carry on
        newStr += "-";
        newStr += str[j];
      }
      else {
        newStr += str[j];
      }
    }
    else {
        newStr += str[j];
    }
  }

  newStr = newStr.toLowerCase();
  return newStr;
}