如何将 PascalCase
字符串转换为 underscore_case/snake_case
字符串?我还需要将句点转换为下划线。
例如,进行转换:
TypeOfData.AlphaBeta
进入
type_of_data_alpha_beta
如何将 PascalCase
字符串转换为 underscore_case/snake_case
字符串?我还需要将句点转换为下划线。
例如,进行转换:
TypeOfData.AlphaBeta
进入
type_of_data_alpha_beta
你可以尝试以下步骤。
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
。 - zahmatialert(s.replace(/\.?([A-Z]+)/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));
- Avinash Rajs.replace(/\.?([A-Z]+)/g, '_$1').toLowerCase().replace(/^_/, "")
。 - l00kstr.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);
split
之前添加trim
即可解决问题。 - Mason或者使用lodash:
lodash.snakeCase(str);
例子:
_.snakeCase('TypeOfData.AlphaBeta');
// ➜ 'type_of_data_alpha_beta'
Lodash是一个优秀的库,可以为许多日常js任务提供快捷方式。还有许多其他类似的字符串操作函数,例如camelCase
、kebabCase
等。
我将代码从Python移植到JavaScript,该代码源自1175208.
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
"alphaBetaGama".replace(/([A-Z])/g, "_$1").toLowerCase() // alpha_beta_gamma
问题 - 需要将驼峰式字符串(例如属性名称)转换为下划线样式以满足接口要求或进行元编程。
解释
这行代码使用了正则表达式的一个特性,它可以返回匹配的结果(第一对括号是$1
,第二对是$2
等)。
将字符串中的每个匹配项都转换为在其前面添加下划线的_$1
字符串。此时,该字符串看起来像alpha_Beta_Gamma
。
为了更正大小写,整个字符串被转换为小写字母。
由于toLowerCase是一个相当昂贵的操作,最好不要将其放在循环处理程序中的每个匹配项中,而是在整个字符串上运行一次。
在执行toLowerCase
之后,得到的结果字符串为alpha_beta_gamma
(在此示例中)
const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/,'')
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;
}
试试这个函数,希望能有所帮助。
CamelToUnderscore
函数进行转换。 - zahmati注意:我知道有很多优秀的答案可以优雅地解决这个问题。最近,我在处理类似于此的问题时选择不使用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"