【问题标题】:hyphens in Regular Expressions/ javascript camelCase function正则表达式/javascript camelCase 函数中的连字符
【发布时间】:2018-05-27 22:21:00
【问题描述】:

函数应该接受一个字符串作为参数,并采用驼峰式大小写。我在使用 regex 和 string.replace() 方法时遇到连字符问题。

camelCase('state-of-the-art') 应该返回 'state-of-the-art' camelCase("别担心 kyoko") 应该返回 "dontWorryKyoko"

以下内容适用于这两种情况,但我想让它干燥,去掉连字符 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 的小写字母,但它似乎并没有在控制台中这样做。

有人想帮忙吗?谢谢

【问题讨论】:

  • this 应该可以帮助您入门(我还没有尝试过)。

标签: javascript regex


【解决方案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"));

【讨论】:

    【解决方案2】:

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

    关于您的小写问题:您现在决定大小写的唯一标准是它是否出现在字符串的开头。否则,您将大写所有内容(包括大写匹配)。这也是一个非常容易解决的问题。以下是全部内容:

    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] 匹配,前面没有空格)

    顺便说一句,_ 下划线字符似乎不是骆驼式的,只是在空格上。这是故意的吗?我从未见过不转换蛇形大小写(下划线)的驼峰形例程。

    【讨论】:

      猜你喜欢
      • 2012-11-23
      • 1970-01-01
      • 2011-09-28
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2012-11-23
      相关资源
      最近更新 更多