JavaScript如何将PascalCase转换为underscore_case/snake_case?

88

如何将 PascalCase 字符串转换为 underscore_case/snake_case 字符串?我还需要将句点转换为下划线。

例如,进行转换:

TypeOfData.AlphaBeta

进入

type_of_data_alpha_beta

试试这个链接吧,它肯定会对你有所帮助:http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ - Santhucool
11个回答

110

你可以尝试以下步骤。

  • Capture all the uppercase letters and also match the preceding optional dot character.

  • Then convert the captured uppercase letters to lowercase and then return back to replace function with an _ as preceding character. This will be achieved by using anonymous function in the replacement part.

  • This would replace the starting uppercase letter to _ + lowercase_letter.

  • Finally removing the starting underscore will give you the desired output.

    var s = 'TypeOfData.AlphaBeta';
    console.log(s.replace(/(?:^|\.?)([A-Z])/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));
    

或者

var s = 'TypeOfData.AlphaBeta';
alert(s.replace(/\.?([A-Z])/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));

有没有办法在整个单词都是大写字母时停止它。例如,将MotorRPM转换为motor_rpm而不是motor_r_p_m?或者将BatteryAAA转换为battery_aaa而不是battery_a_a_a

var s = 'MotorRMP';
alert(s.replace(/\.?([A-Z]+)/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));


谢谢,有没有办法在整个单词都是大写时停止它。例如,将MotorRMP转换为motor_rpm而不是motor_r_p_m?或者将BatteryAAA转换为battery_aaa而不是battery_a_a_a - zahmati
1
alert(s.replace(/\.?([A-Z]+)/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, "")); - Avinash Raj
1
以上解决方案无法处理“attributeGUILabel”,它应该转换为“attribute_gui_label”。 - Scott P.
我找到了一个可行的解决方案..请看下面我的回答。 - Scott P.
2
我更喜欢没有回调函数的s.replace(/\.?([A-Z]+)/g, '_$1').toLowerCase().replace(/^_/, "") - l00k

109
str.split(/\.?(?=[A-Z])/).join('_').toLowerCase();

欢迎

var s1 = 'someTextHere';
var s2 = 'SomeTextHere';
var s3 = 'TypeOfData.AlphaBeta';

var o1 = s1.split(/\.?(?=[A-Z])/).join('_').toLowerCase();
var o2 = s2.split(/\.?(?=[A-Z])/).join('_').toLowerCase();
var o3 = s3.split(/\.?(?=[A-Z])/).join('_').toLowerCase();

console.log(o1);
console.log(o2);
console.log(o3);


由于前导空格,它无法与_'SomeTextHere'_一起使用。在split之前添加trim即可解决问题。 - Mason

64

或者使用lodash

lodash.snakeCase(str);

例子:

_.snakeCase('TypeOfData.AlphaBeta');
//'type_of_data_alpha_beta'

Lodash是一个优秀的库,可以为许多日常js任务提供快捷方式。还有许多其他类似的字符串操作函数,例如camelCasekebabCase等。


4
哇,谢谢你提供这个信息。我之前一直在使用自己写的toSnakeCase、toTitleCase(_.startCase)和toCamelCase函数进行字符串转换。现在我知道了lodash库有这些功能,所以我已经切换到了lodash,并且它比我的实现效果更好! - Noitidart
1
还有,谢谢!我每天都使用lodash,但没意识到它可以做到这一点! - ludacris2k4

12

这个解决方案解决了上述解决方案中的非尾缩写问题

我将代码从Python移植到JavaScript,该代码源自1175208.

Javascript 代码

function camelToSnakeCase(text) {
    return text.replace(/(.)([A-Z][a-z]+)/, '$1_$2').replace(/([a-z0-9])([A-Z])/, '$1_$2').toLowerCase()
}

工作示例:

camelToSnakeCase('thisISDifficult') -> this_is_difficult

camelToSnakeCase('thisISNT') -> this_isnt

camelToSnakeCase('somethingEasyLikeThis') -> something_easy_like_this

11
"alphaBetaGama".replace(/([A-Z])/g, "_$1").toLowerCase() // alpha_beta_gamma

问题 - 需要将驼峰式字符串(例如属性名称)转换为下划线样式以满足接口要求或进行元编程。

解释 这行代码使用了正则表达式的一个特性,它可以返回匹配的结果(第一对括号是$1,第二对是$2等)。

将字符串中的每个匹配项都转换为在其前面添加下划线的_$1字符串。此时,该字符串看起来像alpha_Beta_Gamma

为了更正大小写,整个字符串被转换为小写字母。

由于toLowerCase是一个相当昂贵的操作,最好不要将其放在循环处理程序中的每个匹配项中,而是在整个字符串上运行一次。

在执行toLowerCase之后,得到的结果字符串为alpha_beta_gamma(在此示例中)


1
我发现了this,但我对它进行了编辑以适应你的问题。
const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/,'')

1

1

JavaScript的好例子:

  1. 蛇形命名法
  2. 烤肉串命名法
  3. 驼峰命名法
  4. 帕斯卡命名法

这里查看更多信息。


0
function toCamelCase(s) {
  // remove all characters that should not be in a variable name
  // as well underscores an numbers from the beginning of the string
  s = s.replace(/([^a-zA-Z0-9_\- ])|^[_0-9]+/g, "").trim().toLowerCase();

  // uppercase letters preceeded by a hyphen or a space
  s = s.replace(/([ -]+)([a-zA-Z0-9])/g, function(a,b,c) {
    return c.toUpperCase();
  });

  // uppercase letters following numbers
  s = s.replace(/([0-9]+)([a-zA-Z])/g, function(a,b,c) {
    return b + c.toUpperCase();
  });

  return s;
}

试试这个函数,希望能有所帮助。


5
方向不对吗?需要使用CamelToUnderscore函数进行转换。 - zahmati

0

一个将PascalCase转换成snake_case的非Regex解决方案

注意:我知道有很多优秀的答案可以优雅地解决这个问题。最近,我在处理类似于此的问题时选择不使用regex,因此我觉得回答一个非regex的解决方案。

const toSnakeCase = (str) => {
    return str.slice(0,1).toLowerCase() + str.split('').slice(1).map((char) => {
        if (char == char.toUpperCase()) return '_' + char.toLowerCase();
        else return char;
    }).join('');
}

例如。

inputString = "ILoveJavascript" passed onto toSnakeCase()

将会变成"i_love_javascript"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接