Сопоставьте любой символ в нижнем/верхнем регистре и добавьте дополнительный

#javascript #regex #typescript

Вопрос:

В Javascript я хотел бы сделать следующее. Когда я сопоставляю строчные буквы, за которыми следует верхний регистр, я хотел бы добавить специальный символ между ними.

экс :

  • Мой дом => Мой дом
  • aRandomString => a_Random_String

и т.д…

Я сделал регулярное выражение для этого матча =>

/([a-z][A-Z](.{0})) /g

проблема, с которой я сталкиваюсь, заключается в том, что если я это сделаю

"aRandomString".replace(/([a-z][A-Z](.{0})) /g, '_')

это, конечно, сделает => _ando_tring

Редактировать :

Я сделал это, но не слишком ли это сложно ?

 var mString = "aRandomString";
var match = mString.match(/([a-z][A-Z](.{0})) /g, '_')
var save = [...match]
match = match.map(e => [e.slice(0, 1), '_', e.slice(1)].join(''))
save.forEach((s,i) => mString = mString.replace(s, match[i]))
console.log(mString) 

Комментарии:

1. str.replace(/[A-Z]/g, letter => `_${letter}`

2. @Бобби … что должно произойти со строковым значением, подобным aTestStringForMULTIPLEUpperCase тому, которое Генри выбирал для примера кода? Можно ли ожидать ..._MULTIPLEUpper_Case , что результатом будет любое решение, которое точно соответствует вашей задаче, или скорее ожидать ..._MULTIPLE_Upper_Case , что в нем было больше логики?

3. версия hiw в порядке, то, что мне нужно, — это просто _ , когда есть нижний, за которым следует верхний. неважно, если это сокращает слова или что-то еще.

Ответ №1:

ДА. Вы можете легко сопоставить только строчные и прописные буквы, которые вы ищете, и заменить их заменителем.

 const mString = "aTestStringForMULTIPLEUpperCase";
const uString = mString.replace(/[a-z][A-Z]/g, v => `${v[0]}_${v[1]}`);
console.log(uString); 

Ответ №2:

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

 const regXUppecaseBoundaries = (/(?:(?<=[a-z])[A-Z])|(?:(?<=[A-Z])[A-Z](?=[a-z]))/g);

const sampleText = `myHouse aRandomString
aRandomString aTestStringForMULTIPLEUpperCase
myHouse AaAAaTestStringForMULTIPLEUpperCase`;

// also check ... [https://regex101.com/r/OpmSbx/1]
console.log(
  sampleText.replace(regXUppecaseBoundaries, '_$amp;')
); 
 .as-console-wrapper { min-height: 100%!important; top: 0; }