Регулярное раскручивание верблюжьего футляра

У меня есть регулярное выражение в 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",...);