Javascript将PascalCase转换为underscore_case


Answers:


96

您可以尝试以下步骤。

  • 捕获所有大写字母并匹配前面的可选点字符。

  • 然后将捕获的大写字母转换为小写,然后返回以_前面的字符替换功能。这将通过在替换部分中使用匿名功能来实现。

  • 这会将起始大写字母替换为_+ lowercase_letter。

  • 最后,删除下划线将为您提供所需的输出。

    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(/^_/, ""));

当整个单词为大写形式时,停止它的任何方法。例如。MotorRPMmotor_rpm代替motor_r_p_m?或BatteryAAAbattery_aaa代替battery_a_a_a

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


谢谢,当整个单词都用大写字母时,停止它的任何方法。例如。MotorRMPmotor_rpm代替motor_r_p_m?或BatteryAAAbattery_aaa替代battery_a_a_a
zahmati 2015年

1
alert(s.replace(/\.?([A-Z]+)/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));
Avinash Raj 2015年

上面的解决方案以“ attributeGUILabel”失败,该属性应转换为“ attribute_gui_label”。
Scott P.

我找到了一个可行的解决方案。.请参阅下面的答案
Scott P.

2
我希望没有回调s.replace(/\.?([A-Z]+)/g, '_$1').toLowerCase().replace(/^_/, "")
l00k

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

不客气

var s1 = 'someTextHere';
var s2 = 'SomeTextHere';

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

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


由于前导空格,它不适用于'SomeTextHere'trimsplit解决之前添加一个。
梅森

51

或者使用lodash

lodash.snakeCase(str);

例:

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

Lodash是一个很好的图书馆给快捷方式到许多日常JS tasks.There是许多其他类似的字符串处理函数,例如camelCasekebabCase等等。


3
哇,为此我使用了自己的toSnakeCase,toTitleCase(_。startCase)和toCamelCase。由于这个原因,我现在切换到lodash,并且比我的好很多!我不知道lodash有这个!
Noitidart

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

问题-需要将驼峰大小写的字符串(如属性名)转换为下划线样式,以满足接口要求或用于元编程。

说明: 此行使用了正则表达式的功能,可以返回匹配的结果(第一对()为$1,第二对为$2,等等)。

字符串中的每个匹配项都将转换为前面带有下划线的_$1字符串,并提供了字符串。此时,字符串看起来像alpha_Beta_Gamma

为了更正大写,将整个字符串转换为LowerCase()。

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

之后toLowerCase的结果字符串是alpha_beta_gamma(在此示例中)


10

该解决方案通过上述解决方案解决了非追溯首字母缩略词问题

我在1175208中将代码从Python移植到JavaScript。

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


1
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 2015年

0
"TestString".replace(/[A-Z]/g, val => "_" + val.toLowerCase()).replace(/^_/,"")

用下划线和小写替换所有大写字母,然后删除前划线。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.