正则表达式中的连字符/ javascript camelCase函数

时间:2018-05-27 13:41:14

标签: javascript regex

函数应该将一个字符串作为参数并使用驼峰的情况。我在使用regex和string.replace()方法时遇到连字符问题。

camelCase('最先进的')应该返回最先进的' camelCase("不要担心kyoko")应该返回" dontWorryKyoko"

以下两种情况都适用,但我想将其设为DRY,取出连字符if子句,并在.replace()中包含连字符大小写并回拨它。

function camelCase(phrase) {    
 let re = /[a-z]+/i;
 let hyphens = /[-+]/g
   if(typeof phrase !== 'string' || !phrase.match(re) || !phrase || phrase === null){
   return "Please enter a valid string.";
   } else if (phrase.match(hyphens)){
    return phrase.toLocaleLowerCase();
   }else{
     return phrase.replace(/(?:^\w+|[A-Z]|\s+\w)/g, function(letter, index) {
       return index == 0 ? letter.toLowerCase() : letter.toUpperCase();
       }).replace(/\W+/g, '');
       }
    }
console.log(camelCase('state-of-the-art')) // 'state-of-the-art'
console.log(camelCase("Don't look back"))  // dontLookBack

我们可以让连字符案例在没有连字符if子句的情况下工作吗? 另外我觉得camelCase("don't lOOk_BaCK")应该是小写字母,索引> 0但它似乎没有在控制台中这样做。

有人想帮忙吗?感谢名单

2 个答案:

答案 0 :(得分:1)

要解决连字符问题,您可以在适当情况下使用-[\w-][^\w-]视为字母数字类的一部分。

要将所有非首字母小写,我建议将所有字词与(\S)(\S*)大写字母$1(如果适用)和小写字母$2匹配:



function camelCase(phrase) {
    return phrase.replace(/[^\w-]*(\S)(\S+)/g, function(_, first, rest, index) {
        return (index ? first.toUpperCase() : first.toLowerCase())
            + rest.toLowerCase();
    }).replace(/[^\w-]+/g, "");
}

console.log(camelCase("state-of-the-art"));
console.log(camelCase("-state-of-the-art"));
console.log(camelCase("Don't look back"));
console.log(camelCase("don't lOOk_BaCK"));
console.log(camelCase("???don't lOOk_BaCK"));




答案 1 :(得分:0)

您可以通过添加否定前瞻断言.replace(/(?!-)\W+/g, '');来使连字符起作用。这将告诉它替换除-短划线字符之外的所有非单词字符。

关于您的下层问题:现在判断案例的唯一标准是它是否出现在字符串的开头。否则你就是UPPER套管所有东西(包括大写的匹配)。这也是一个非常简单的解决方案。这就是整个事情:

function camelCase(phrase) {
  let re = /[a-z]+/i;
  if (typeof phrase !== 'string' || !phrase.match(re) || !phrase || phrase === null) {
    return "Please enter a valid string.";
  } else {
    return phrase.replace(/(?:^\w+|(\s+)\w)|[A-Z]/g, function (letter, sp, index) {
      console.log(letter, sp, index);
      return (index == 0 || sp === undefined) ? letter.toLowerCase() : letter.toUpperCase();
    }).replace(/(?!-)\W+/g, '');
  }
}

更改说明:

  • 更改phrase.replace正则表达式中的断言顺序。我们希望空格词组合优先于大写的匹配。
  • 向空间添加捕获组,以便我们可以更好地了解捕获是否遵循空格
  • 更改布尔表达式:我们希望它是小写的,如果:
    1. 这是第一个字符(index===0
    2. 或者没有空格匹配(这将是[A-Z]匹配,没有前面的空格)

另外,对于_下划线字符,您似乎不是骆驼套管,仅在空格上。这是故意的吗?我从未见过没有转换过蛇形(下划线)的驼峰式例程。