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