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;
}

Попробуйте эту функцию, надеюсь, это поможет.

Хорошие примеры для js:

  1. Змеиный чехол
  2. Кебаб Кейс
  3. Случай верблюда
  4. Паскаль Кейс

есть здесь

Ответ без регулярного выражения, который преобразует 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(/^_/,"")

заменяет все прописные буквы подчеркиванием и строчными, затем удаляет начальное подчеркивание.

Другие вопросы по тегам