Javascript конвертировать PascalCase в underscore_case
Как я могу конвертировать PascalCase
вступить в underscore_case
строка? Мне нужно преобразование точек, чтобы подчеркнуть, а также.
например. перерабатывать
TypeOfData.AlphaBeta
в
type_of_data_alpha_beta
11 ответов
Вы можете попробовать следующие шаги.
Захватите все заглавные буквы, а также сопоставьте предыдущий необязательный символ точки.
Затем преобразуйте захваченные заглавные буквы в строчные, а затем вернитесь назад, чтобы заменить функцию
_
как предыдущий персонаж. Это будет достигнуто с помощью анонимной функции в запасной части.Это заменит начальную заглавную букву
_
+ 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(/^_/, ""));
любой способ остановить это, когда все слово в верхнем регистре. например.
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(/^_/, ""));
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);
Альтернативно, используя lodash:
lodash.snakeCase(str);
Пример:
_.snakeCase('TypeOfData.AlphaBeta');
// ➜ 'type_of_data_alpha_beta'
Lodash - это прекрасная библиотека для быстрого доступа ко многим повседневным задачам js. Есть много других подобных функций манипуляции со строками, таких как camelCase
, kebabCase
и т.п.
"alphaBetaGama".replace(/([A-Z])/g, "_$1").toLowerCase() // alpha_beta_gamma
Проблема - Необходимо преобразовать строку с верблюжьим регистром (например, имя свойства) в стиль подчеркивания для соответствия требованиям интерфейса или для метапрограммирования.
Пояснение - эта строка использует функцию регулярных выражений, где она может вернуть соответствующий результат (первая пара () $1
второй $2
, и т.д).
Каждое совпадение в строке преобразуется в подчеркивание перед _$1
строка предоставлена. В этот момент строка выглядит так alpha_Beta_Gamma
,
Чтобы исправить заглавные буквы, вся строка преобразуется в LowCase().
Поскольку toLowerCase является довольно дорогой операцией, лучше не помещать ее в обработчик цикла для каждого случая сопоставления, а запускать один раз для всей строки.
После toLowerCase
если результирующая строка alpha_beta_gamma
(в этом примере)
Это решение решает проблему нетронутой аббревиатуры с решениями выше
Я перенес код в 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
Это продвинет вас довольно далеко: https://github.com/domchristie/humps
Вам, вероятно, придется использовать регулярное выражение для замены "." с подчеркиванием.
Я нашел это, но отредактировал так, чтобы удовлетворить ваш вопрос.
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;
}
Попробуйте эту функцию, надеюсь, это поможет.
Ответ без регулярного выражения, который преобразует PascalCase в snake_case
Примечание: я понимаю, что есть масса хороших ответов, которые элегантно решают этот вопрос. Недавно я работал над чем-то похожим на это, где я решил не использовать
regex
. Так что я решил ответить на
non-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"
"TestString".replace(/[A-Z]/g, val => "_" + val.toLowerCase()).replace(/^_/,"")
заменяет все прописные буквы подчеркиванием и строчными, затем удаляет начальное подчеркивание.