Как конвертировать "CamelCase" в "Camel Case"?

Я пытался заставить команду JavaScript для регулярных выражений превратить что-то вроде "thisString" в "This String", но самое близкое, что я получил, - это заменить букву, в результате чего получилось что-то вроде "Thi String" или "This tring". Есть идеи?

Чтобы прояснить, я могу справиться с простотой использования заглавной буквы, я просто не так силен с RegEx, и разделение "somethingLikeThis" на "something Like This" - вот где у меня возникают проблемы.

Ответ 1

"thisStringIsGood"
    // insert a space before all caps
    .replace(/([A-Z])/g, ' $1')
    // uppercase the first character
    .replace(/^./, function(str){ return str.toUpperCase(); })

отображает

This String Is Good

(function() {

  var $textbox = $('#textbox'),
    $result = $('#result'),
    splitter = function() {
      $result.html($textbox.val()
        // insert a space before all caps
        .replace(/([A-Z])/g, ' $1')
        // uppercase the first character
        .replace(/^./, function(str) {
          return str.toUpperCase();
        }));
    };

  $textbox.on('input', splitter);
  
  splitter();
}());
#result {
  margin-top: 10px;
  padding-top: 10px;
  border-top: solid 1px #c3c3c3;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div>
  Text to split
  <input id="textbox" value="thisStringIsGood" />
</div>

<div id="result"></div>

Ответ 2

У меня был простой интерес к этому, особенно при обработке последовательностей капиталов, например, в xmlHTTPRequest. Перечисленные функции создадут "Xml H T T P Request" или "Xml HTTPRequest", мой выпуск "Xml HTTP Request".

function unCamelCase (str){
    return str
        // insert a space between lower & upper
        .replace(/([a-z])([A-Z])/g, '$1 $2')
        // space before last upper in a sequence followed by lower
        .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
        // uppercase the first character
        .replace(/^./, function(str){ return str.toUpperCase(); })
}

Также существует версия String.prototype в стиле.

Ответ 3

Это можно сделать с помощью регулярного выражения (живая демонстрация):

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).join(' ');
}

(Я думал, что флаг g (global) необходим, но, как ни странно, это не в этом конкретном случае.)

Использование lookahead с split гарантирует, что совпадающая заглавная буква не будет потребляться и избегает иметь дело с ведущим пространством, если UpperCamelCase - это то, с чем вам нужно иметь дело. Чтобы загладить первую букву каждого из них, вы можете использовать:

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).map(function(p) {
        return p.charAt(0).toUpperCase() + p.slice(1);
    }).join(' ');
}

Метод массива map - это функция ES5, но вы все равно можете использовать ее в старых браузерах с некоторым кодом из MDC. Кроме того, вы можете перебирать элементы массива с помощью цикла for.

Ответ 4

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

Например: someVariable = > someVariable, но ABCCode!= A B C Code.

Ниже приведен пример регулярного выражения, но также и общий пример представления сокращений в camcelCase.

"somethingLikeThis"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "something Like This"

"someVariableWithABCCode"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "some Variable With ABC Code"

Вы также можете настроить, как указано выше, для заглавной буквы первого символа.

Ответ 5

function spacecamel(s){
    return s.replace(/([a-z])([A-Z])/g, '$1 $2');
}

spacecamel ( 'somethingLikeThis')

//возвращаемое значение: что-то вроде этого

Ответ 7

Решение, которое также обрабатывает числа:

function capSplit(str){
   return str.replace
      ( /(^[a-z]+)|[0-9]+|[A-Z][a-z]+|[A-Z]+(?=[A-Z][a-z]|[0-9])/g
      , function(match, first){
          if (first) match = match[0].toUpperCase() + match.substr(1);
          return match + ' ';
          }
       )
   }

Протестировано здесь [JSFiddle, нет библиотеки. Не пробовал IE]; должен быть довольно стабильным.

Ответ 8

Если вы не заботитесь о старых браузерах (или не возражаете использовать резервную уменьшить функцию для них), это может разделить четные строки, такие как "xmlHTTPRequest" (но, безусловно, XMLHTTPRequest 'не может).

function splitCamelCase(str) {
        return str.split(/(?=[A-Z])/)
                  .reduce(function(p, c, i) {
                    if (c.length === 1) {
                        if (i === 0) {
                            p.push(c);
                        } else {
                            var last = p.pop(), ending = last.slice(-1);
                            if (ending === ending.toLowerCase()) {
                                p.push(last);
                                p.push(c);
                            } else {
                                p.push(last + c);
                            }
                        }
                    } else {
                        p.push(c.charAt(0).toUpperCase() + c.slice(1));
                    }
                    return p;
                  }, [])
                  .join(' ');
}

Ответ 9

Моя версия

function camelToSpace (txt) {
  return txt
    .replace(/([^A-Z]*)([A-Z]*)([A-Z])([^A-Z]*)/g, '$1 $2 $3$4')
    .replace(/ +/g, ' ')
}
camelToSpace("camelToSpaceWithTLAStuff") //=> "camel To Space With TLA Stuff"

Ответ 10

Попробуйте это решение здесь -

var value = "myCamelCaseText";
var newStr = '';
for (var i = 0; i < value.length; i++) {
  if (value.charAt(i) === value.charAt(i).toUpperCase()) {
    newStr = newStr + ' ' + value.charAt(i)
  } else {
    (i == 0) ? (newStr += value.charAt(i).toUpperCase()) : (newStr += value.charAt(i));
  }
}
return newStr;

Ответ 11

Не регулярное выражение, но полезно знать простые старые методы, подобные этому.

var origString = "thisString";
var newString = origString.charAt(0).toUpperCase() + origString.substring(1);