Регулярное выражение или другой способ преобразования в верблюжий регистр в JavaScript

Я просмотрел похожие сообщения, но ни один из них не касается этого конкретного случая. Я хочу преобразовать некоторые старые соглашения об именах в верблюжий случай. Однако я хочу, чтобы преобразование было ограничено только следующим:

Строка (состоящая из букв в любом регистре или цифр), за которой следует символ подчеркивания, за которым следует алфавит, должна быть заменена такой же строкой, за которой следует тот же алфавит, но только этот алфавит в верхнем регистре. Больше ничего.

Некоторые примеры:

aXc9tu_muKxx  ->  aXc9tuMuKxx
zdmmpFmxf     ->  zdmmpFmxf //unchanged 
_xfefx        ->  _xfefx    //unchanged
Z_9fefx       ->  Z9fefx    //EDITED after getting answers.

Так что если ? в регулярном выражении означало 1 или более вхождений, а [] использовался для указания диапазона символов, тогда я мог бы предположить, что исходное выражение будет: ([0-9a-zA-Z])?_([0-9a -зА-Я])?

Я готов использовать Javascript или любой инструмент Linux. Я еще раз повторяю, что преобразование будет включать только два символа _ и букву сразу после него, если это действительно буква. Знак _ будет удален, а буква будет заглавной. Если это не буква, а цифра, то будет удалено просто нижнее подчеркивание.

Цель состоит в том, чтобы перейти к верблюжьему регистру, но сохранить удобочитаемость старых соглашений об именах, где удобочитаемость может быть нарушена после преобразования. Например, THIS_IS_A_CONSTANT не изменяется на THISISACONSTANT.


person Sunny    schedule 19.11.2015    source источник


Ответы (1)


Вы можете использовать обратный вызов замены:

function toCamelCase(str) {
  return str.replace(/(?!^)_([a-z])/g, function(matches) {
    return matches[1].toUpperCase();
  });
}

Объяснение регулярного выражения:

(?!^) – не совпадать в начале строки (ваш пример "_xfefx")
_ – совпадать с символом подчеркивания (ну...)
([a-z]) – совпадать с одной строчной буквой и захватывать группу 1, matches[1]
/.../g - "глобальное" соответствие, т.е. заменить не только первое, но и все вхождения

person Leon Adler    schedule 19.11.2015
comment
Это не жадное сопоставление, это глобальное сопоставление. - person ; 19.11.2015
comment
@ЛинАдлер. Да, он работает так, как ожидалось. НЕ конвертирует все прописные буквы, как в MY_CONSTANT_CONFIG, что приятно, хотя и не указано мной. Преобразование сделало бы его нечитаемым. Кроме того, обрабатывает несколько вхождений, как в xx_xAc_atx9. Я принимаю ответ. Можете ли вы немного изменить его, чтобы он также обрабатывал такие случаи, как xxx_9xxx, где будет удален только _? Я отредактировал свой вопрос, так как пример был неправильным. Спасибо! - person Sunny; 19.11.2015
comment
@Samir просто добавьте разрешенные символы в класс. то есть: изменить [a-z] на [a-z0-9] - person Mariano; 19.11.2015
comment
да, или явно исключить символы, которые не нужно сопоставлять: [^A-Z] - person Leon Adler; 19.11.2015
comment
@Mariano - возможно, проще \w. - person RobG; 19.11.2015
comment
@RobG \w включает _ и прописные буквы, и ОП заявил, что это не должно совпадать. - person Mariano; 19.11.2015