Как конвертировать "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')
//возвращаемое значение: что-то вроде этого
Ответ 6
Lodash прекрасно справляется с этим с помощью _.startCase()
Ответ 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);