Регулярное раскручивание верблюжьего футляра
У меня есть регулярное выражение в JavaScript, чтобы разделить строку моего верблюда на верхние буквы, используя следующий код (который я впоследствии получил от здесь):
"MyCamelCaseString"
.replace(/([A-Z])/g, ' $1')
.replace(/^./, function(str){ return str.toUpperCase(); })
Таким образом, возвращается:
"My Camel Case String"
Это хорошо. Однако я хочу сделать это на ступеньку выше. Может ли кто-нибудь помочь мне с регулярным выражением, которое будет разделяться, если и только если первый символ имеет нижний регистр, а последний - верхний регистр.
Таким образом, приведенный выше пример будет результатом, которого я ожидаю, но если я это сделаю:
"ExampleID"
Затем я возвращаюсь:
"Example ID"
Вместо
"Example I D"
Так как он расщепляется в каждом верхнем регистре и игнорирует что-либо перед ним.
Надеюсь, что это имеет смысл! И спасибо:).
Ответы
Ответ 1
Я предполагаю заменить /([AZ])/
на /([az])([AZ])/
и ' $1'
на '$1 $2'
"MyCamelCaseString"
.replace(/([a-z])([A-Z])/g, '$1 $2');
/([a-z0-9])([AZ])/
для чисел, считающихся строчными
console.log("MyCamelCaseStringID".replace(/([a-z0-9])([A-Z])/g, '$1 $2'))
Ответ 2
"MyCamelCaseString".replace(/([a-z](?=[A-Z]))/g, '$1 ')
выходы:
"My Camel Case String"
Ответ 3
Если вам нужен массив строчных слов:
"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase());
Если вы хотите строку строчных слов:
"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase()).join(' ');
Если вы хотите отделить слова, но сохранить регистр:
"myCamelCaseString".replace(/([a-z])([A-Z])/g, '$1 $2')
Ответ 4
Привет, я не видел живой demo, спасибо @michiel-dral
var tests =[ "camelCase",
"simple",
"number1Case2"]
function getCamelCaseArray(camel) {
var reg = /([a-z0-9])([A-Z])/g;
return camel.replace(reg, '$1 $2').split(' ');
}
function printTest(test) {
document.write('<p>'+test + '=' + getCamelCaseArray(test)+'</p>');
}
tests.forEach(printTest);
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css">
<script src="script.js"></script>
</head>
<body>
</body>
</html>
Ответ 5
Я предпочитаю работать с массивами над строками. Это проще для отладки и более гибким. Это фактическое join
вместо replace
. Я не имел дело с пробелами в строках, но вы могли бы достаточно просто обрезать каждый элемент.
const splitCamelCase = str => str.match(/^[A-Z]?[^A-Z]*|[A-Z][^A-Z]*/g).join(' ');
console.log(splitCamelCase('fooMyCamelCaseString'));
console.log(splitCamelCase('MyCamelCaseString'));
console.log(splitCamelCase('XYZMyCamelCaseString'));
console.log(splitCamelCase('alllowercase'));
Ответ 6
Иногда строки camelCase содержат сокращения, например:
PDFSplitAndMergeSamples
PDFExtractorSDKSamples
PDFRendererSDKSamples
BarcodeReaderSDKSamples
И в этом случае будет работать следующая функция: она разбивает строку, оставляя аббревиатуры как отдельные строки:
function SplitCamelCaseWithAbbreviations(s){
return s.split(/([A-Z][a-z]+)/).filter(function(e){return e});
}
Пример:
function SplitCamelCaseWithAbbreviations(s){
return s.split(/([A-Z][a-z]+)/).filter(function(e){return e});
}
console.log(SplitCamelCaseWithAbbreviations('PDFSplitAndMergeSamples'));
console.log(SplitCamelCaseWithAbbreviations('PDFExtractorSDKSamples'));
console.log(SplitCamelCaseWithAbbreviations('PDFRendererSDKSamples'));
console.log(SplitCamelCaseWithAbbreviations('BarcodeReaderSDKSamples'));
Ответ 7
Эта строка RegExp
.replace("/([a-zA-Z][a-z]*)/g",...);