将骆驼大小写转换为人类可读的字符串?

Posted

技术标签:

【中文标题】将骆驼大小写转换为人类可读的字符串?【英文标题】:Convert camel case to human readable string? 【发布时间】:2014-02-04 12:52:31 【问题描述】:

是否有将驼峰式大小写、css 和下划线转换为人类可读格式的 reg exp 或函数?它此时不需要支持非人类。对不起外星人。 :(

例子:

helloWorld -> “你好世界” 你好世界->“你好世界” hello_world -> “你好世界”

【问题讨论】:

驼峰式大小写不可读? 【参考方案1】:

我不知道是否已经有内置方法可以执行此操作,但是您可以循环遍历字符串,并且每次看到要拆分的字符时都这样做。

在你的情况下是这样的:

    my_str = 'helloWorld';
    returnString = '';
    for(var i = 0; i < my_str.length; i++) 
        if(i == 0) 
            returnString += (my_str[i] + 32); // capitalize the first character
        
        else if(my_str[i] > 'A' || my_str[i] < 'Z') 
            returnString += ' ' + my_str[i]; // add a space
        
        else if(my_str[i] == '-' || my_str[i] == '_') 
            returnString += ' ';
        
        else 
            returnString += my_string[i];
        
    

   return returnString;

编辑:

经过无数次 cmet 之后,我开始意识到我提交了一些损坏的代码:P

这是一个经过测试的版本:

my_str = 'helloWorld';

function readable(str) 
    // and this was a mistake about javascript/actionscript being able to capitalize
    // by adding 32
    returnString = str[0].toUpperCase();

    for(var i = 1; i < str.length; i++) 
        // my mistakes here were that it needs to be between BOTH 'A' and 'Z' inclusive
        if(str[i] >= 'A' && str[i] <= 'Z') 
            returnString += ' ' + str[i];
        
        else if(str[i] == '-' || str[i] == '_') 
            returnString += ' ';
        
        else 
            returnString += str[i];
        
    

    return returnString;

【讨论】:

干得好,但 javascript 不是 C。 my_str[i] &gt; 'A'my_str[i] &lt; 'Z' 应该是 &gt;=&lt;= 我会告诉你,javascript 很可能提供了一种更好的编码方式,但这仍然是重点。事后看来 my_str[i] + 32 可能只是将 32 附加到 javascript 中的字符。 这个(my_str[i] + 32) 抛出一个错误。 :P 我刚刚意识到我可以使用 String().toUpperCase()。 是的,这可能就是@thg435 所指的。在 javascript 中,它只会将 32 附加到第一个字符,而在 C 中它将第一个字符增加 32,从而将其大写。【参考方案2】:

您可以将replacement function 用于String.replace,例如

function capitalize(s) 
    return s[0].toUpperCase() + s.slice(1);


function replacer1(match, p1, p2, p3, offset, s) 
    return p1 + capitalize(p2) + ' ' + p3;


var s1 = "helloWorld";
var r1 = s1.replace(/(^|[^a-z])([a-z]+)([A-Z])/, replacer1);
console.log(r1);

hello-worldhello_world 工作相似。

见JSFiddle

【讨论】:

【参考方案3】:

非词分割;大写;加入:

function toCapitalizedWords(name) 
    var words = name.match(/[A-Za-z][a-z]*/g) || [];

    return words.map(capitalize).join(" ");


function capitalize(word) 
    return word.charAt(0).toUpperCase() + word.substring(1);

【讨论】:

这也会将“test.hello”更改为“Test Hello”。对于那些只想更改大小写、下划线和连字符的人,请使用此正则表达式:/[A-Za-z][^_\-A-Z]*/g man JS 确实需要内置的字符串方法。这工作得很好,但它很丑陋,需要你的大脑为简单的事情搅动。 @YungGun 人们真正想要这样做的频率有多高……? 这也不适用于数字。这个正则表达式 /[A-Za-z][a-z]*|[0-9]+/g 会给你 'addressLine1' => 'Address Line 1'【参考方案4】:

这是基于来自 Ricks C 示例代码的想法的 ActionScript 版本。对于 JavaScript 版本,删除强类型。例如,将var value:String 更改为var value。基本上删除任何以分号开头的声明,:String:int 等。

/**
 * Changes camel case to a human readable format. So helloWorld, hello-world and hello_world becomes "Hello World". 
 * */
public static function prettifyCamelCase(value:String=""):String 
    var output:String = "";
    var len:int = value.length;
    var char:String;

    for (var i:int;i<len;i++) 
        char = value.charAt(i);

        if (i==0) 
            output += char.toUpperCase();
        
        else if (char !== char.toLowerCase() && char === char.toUpperCase()) 
            output += " " + char;
        
        else if (char == "-" || char == "_") 
            output += " ";
        
        else 
            output += char;
        
    

    return output;

JavaScript 版本:

/**
 * Changes camel case to a human readable format. So helloWorld, hello-world and hello_world becomes "Hello World". 
 * */
function prettifyCamelCase(str) 
    var output = "";
    var len = str.length;
    var char;

    for (var i=0 ; i<len ; i++) 
        char = str.charAt(i);

        if (i==0) 
            output += char.toUpperCase();
        
        else if (char !== char.toLowerCase() && char === char.toUpperCase()) 
            output += " " + char;
        
        else if (char == "-" || char == "_") 
            output += " ";
        
        else 
            output += char;
        
    

    return output;

【讨论】:

var i:int 需要= 0 吗? 没有。声明时整数初始化为 0。哎呀,是的,在你做的 JS 中。我添加了一个 JS 示例。【参考方案5】:

使用正则表达式提取所有单词。大写它们。然后,用空格将它们连接起来。

示例正则表达式:

/^[a-z]+|[A-Z][a-z]*/g

/   ^[a-z]+      // 1 or more lowercase letters at the beginning of the string
    |            // OR
    [A-Z][a-z]*  // a capital letter followed by zero or more lowercase letters
/g               // global, match all instances  

示例函数:

var camelCaseToWords = function(str)
    return str.match(/^[a-z]+|[A-Z][a-z]*/g).map(function(x)
        return x[0].toUpperCase() + x.substr(1).toLowerCase();
    ).join(' ');
;

camelCaseToWords('camelCaseString');
// Camel Case String

camelCaseToWords('thisIsATest');
// This Is A Test

【讨论】:

【参考方案6】:

如果使用库是一个选项,LodashstartCaselowerCase 可能是选项:

https://lodash.com/docs/#startCase

https://lodash.com/docs/#lowerCase

【讨论】:

【参考方案7】:

使用正则表达式的非优雅单行替换为函数。

替换 1 - 大写首字母并删除 _-

替换 2 - 在小写字母和大写字母之间添加空格

var titleCase = s => s
  .replace(/(^|[_-])([a-z])/g, (a, b, c) => c.toUpperCase())
  .replace(/([a-z])([A-Z])/g, (a, b, c) => `$b $c`);

console.log(titleCase("helloWorld"));
console.log(titleCase("hello-world"));
console.log(titleCase("hello_world"));

【讨论】:

以上是关于将骆驼大小写转换为人类可读的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将此特定的 varchar 转换为人类可读的日期格式?

如何将纳秒的纪元时间转换为人类可读的?

如何停止 Pandas Dataframe read_json 方法将我的时代转换为人类可读的字符串

如何使用 sed 将纪元转换为人类可读的日期时间

将纪元转换为人类可读的日期在 python 中不起作用

如何在 Java 中将 CamelCase 转换为人类可读的名称?