Как я могу преобразовать строку типа «helloThere» или «HelloThere» в «Hello There» в JavaScript?
Как я могу преобразовать строку типа «helloThere» или «HelloThere» в «Hello There» в JavaScript?
Ответы:
var text = 'helloThereMister';
var result = text.replace( /([A-Z])/g, " $1" );
var finalResult = result.charAt(0).toUpperCase() + result.slice(1);
console.log(finalResult);
первая буква должна быть заглавной - в качестве примера.
Обратите внимание на пространство в " $1"
.
РЕДАКТИРОВАТЬ: добавлен пример использования заглавной буквы в первой букве. Конечно, если первая буква уже заглавная - вам нужно будет удалить свободное место.
text.replace
, я также
Non-GoogleChrome
?
usb ports
как uSBPorts
, я украл бы клавиши Shift из их клавиатуры. Я надеюсь, что так и будет usbPorts
. В таких случаях, как theUSA
, у вас может быть опция, например consecutiveCapsMode
, с разными режимами: lower
и split
, например. Тогда все camelToSentence('theUSA', { consecutiveCapsMode: 'lower' })
должно вернуться theUsa
и т. Д.
camelToKebab = (str, mode) { let rgx = /defaultRgx/; switch(mode) { 'lower': rgx = /lowerRgx/; break; } ... }
В качестве альтернативы используя lodash :
lodash.startCase(str);
Пример:
_.startCase('helloThere');
// ➜ 'Hello There'
Lodash - прекрасная библиотека для быстрого доступа ко многим повседневным задачам js. Есть много других подобных функций манипулирования строками, таких как camelCase
и kebabCase
т. Д.
hello world
то вывод должен быть Hello There
: В этом случае loadash не поможет.
hello world
в Hello World
lodash.com/docs/4.17.15#upperFirst
hello there
в hello world
.
У меня была аналогичная проблема, и я решил ее так:
stringValue.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2")
Для более надежного решения:
stringValue.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1")
Вход:
helloThere
HelloThere
ILoveTheUSA
iLoveTheUSA
Выход:
hello There
Hello There
I Love The USA
i Love The USA
Пример без побочных эффектов.
function camel2title(camelCase) {
// no side-effects
return camelCase
// inject space before the upper case letters
.replace(/([A-Z])/g, function(match) {
return " " + match;
})
// replace first char with upper case
.replace(/^./, function(match) {
return match.toUpperCase();
});
}
В ES6
const camel2title = (camelCase) => camelCase
.replace(/([A-Z])/g, (match) => ` ${match}`)
.replace(/^./, (match) => match.toUpperCase());
Лучшая строка, которую я нашел для тестирования функций от верблюжьего регистра к заголовку, - это смехотворно бессмысленный пример, который проверяет множество крайних случаев. Насколько мне известно, ни одна из ранее опубликованных функций не справляется с этим правильно :
__ToGetYourGEDInTimeASongOThe26ABCsIsOfTheEssenceButAPpersonalIDCardForUser_456InRoom26ACсодержащийABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D
Это должно быть преобразовано в:
Получить GED вовремя Песня о 26 азбуках важна, но личная идентификационная карта для пользователя 456 в комнате 26A, содержащая ABC 26 раз, не так просто, как 123 для C3PO, R2D2 или 2R2D
Если вам нужна простая функция, которая обрабатывает случаи, подобные приведенному выше (и больше случаев, чем многие из предыдущих ответов), вот тот, который я написал. Этот код не особенно элегантен или быстр, но он прост, понятен и работает.
Приведенный ниже фрагмент содержит пример выполнения в Интернете:
var mystrings = [ "__ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D", "helloThere", "HelloThere", "ILoveTheUSA", "iLoveTheUSA", "DBHostCountry", "SetSlot123ToInput456", "ILoveTheUSANetworkInTheUSA", "Limit_IOC_Duration", "_This_is_a_Test_of_Network123_in_12__days_", "ASongAboutTheABCsIsFunToSing", "CFDs", "DBSettings", "IWouldLove1Apple", "Employee22IsCool", "SubIDIn", "ConfigureABCsImmediately", "UseMainNameOnBehalfOfSubNameInOrders" ];
// Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
//
// E.g.:
// __ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D
// --> To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D
// helloThere --> Hello There
// HelloThere --> Hello There
// ILoveTheUSA --> I Love The USA
// iLoveTheUSA --> I Love The USA
// DBHostCountry --> DB Host Country
// SetSlot123ToInput456 --> Set Slot 123 To Input 456
// ILoveTheUSANetworkInTheUSA --> I Love The USA Network In The USA
// Limit_IOC_Duration --> Limit IOC Duration
// This_is_a_Test_of_Network123_in_12_days --> This Is A Test Of Network 123 In 12 Days
// ASongAboutTheABCsIsFunToSing --> A Song About The ABCs Is Fun To Sing
// CFDs --> CFDs
// DBSettings --> DB Settings
// IWouldLove1Apple --> I Would Love 1 Apple
// Employee22IsCool --> Employee 22 Is Cool
// SubIDIn --> Sub ID In
// ConfigureCFDsImmediately --> Configure CFDs Immediately
// UseTakerLoginForOnBehalfOfSubIDInOrders --> Use Taker Login For On Behalf Of Sub ID In Orders
//
function camelCaseToTitleCase(in_camelCaseString) {
var result = in_camelCaseString // "__ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
.replace(/(_)+/g, ' ') // " ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser 456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
.replace(/([a-z])([A-Z][a-z])/g, "$1 $2") // " To Get YourGEDIn TimeASong About The26ABCs IsOf The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times IsNot AsEasy As123ForC3POOrR2D2Or2R2D"
.replace(/([A-Z][a-z])([A-Z])/g, "$1 $2") // " To Get YourGEDIn TimeASong About The26ABCs Is Of The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
.replace(/([a-z])([A-Z]+[a-z])/g, "$1 $2") // " To Get Your GEDIn Time ASong About The26ABCs Is Of The Essence But APersonal IDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
.replace(/([A-Z]+)([A-Z][a-z][a-z])/g, "$1 $2") // " To Get Your GEDIn Time A Song About The26ABCs Is Of The Essence But A Personal ID Card For User456In Room26A ContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
.replace(/([a-z]+)([A-Z0-9]+)/g, "$1 $2") // " To Get Your GEDIn Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3POOr R2D2Or 2R2D"
// Note: the next regex includes a special case to exclude plurals of acronyms, e.g. "ABCs"
.replace(/([A-Z]+)([A-Z][a-rt-z][a-z]*)/g, "$1 $2") // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"
.replace(/([0-9])([A-Z][a-z]+)/g, "$1 $2") // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC 26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"
// Note: the next two regexes use {2,} instead of + to add space on phrases like Room26A and 26ABCs but not on phrases like R2D2 and C3PO"
.replace(/([A-Z]{2,})([0-9]{2,})/g, "$1 $2") // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
.replace(/([0-9]{2,})([A-Z]{2,})/g, "$1 $2") // " To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
.trim() // "To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
;
// capitalize the first letter
return result.charAt(0).toUpperCase() + result.slice(1);
}
for (var i = 0; i < mystrings.length; i++) {
jQuery(document.body).append("<br />\"");
jQuery(document.body).append(camelCaseToTitleCase(mystrings[i]));
jQuery(document.body).append("\"<br>(was: \"");
jQuery(document.body).append(mystrings[i]);
jQuery(document.body).append("\") <br />");
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
.replace(/_/g,' ')
решает эту проблему. Кроме того, добавление .replace(\&\, ' & ')
поддерживает разделение амперсанда
camelCaseToTitleCase()
выше функцию в помощник, который обрабатывает символы подчеркивания, поэтому я не заметил упущения, когда опубликовал его. Я исправлю код выше.
Основываясь на одном из приведенных выше примеров, я пришел к следующему:
const camelToTitle = (camelCase) => camelCase
.replace(/([A-Z])/g, (match) => ` ${match}`)
.replace(/^./, (match) => match.toUpperCase())
.trim()
Это работает для меня, потому что он используется .trim()
для обработки крайнего случая, когда первая буква пишется с заглавной буквы, а вы получаете дополнительный ведущий пробел.
Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
Хорошо, я на несколько лет опоздал с игрой, но у меня был аналогичный вопрос, и я хотел сделать решение с одной заменой для каждого возможного ввода. Я должен отдать должное @ZenMaster в этой ветке и @Benjamin Udink ten Cate в этой ветке. Вот код:
var camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
var textArray = ["lowercase",
"Class",
"MyClass",
"HTML",
"PDFLoader",
"AString",
"SimpleXMLParser",
"GL11Version",
"99Bottles",
"May5",
"BFG9000"];
var text;
var resultArray = [];
for (var i = 0; i < textArray.length; i++){
text = textArray[i];
text = text.replace(camelEdges,'$1 ');
text = text.charAt(0).toUpperCase() + text.slice(1);
resultArray.push(text);
}
В нем есть три предложения, все из которых используют опережающий просмотр, чтобы механизм регулярных выражений не использовал слишком много символов:
[A-Z](?=[A-Z][a-z])
ищет заглавную букву, за которой следует заглавная, а затем строчная. Это конец аббревиатуры типа USA.[^A-Z](?=[A-Z])
ищет заглавные буквы, за которыми следует заглавная буква. На этом заканчиваются такие слова, как myWord, и символы, такие как 99Bottles.[a-zA-Z](?=[^a-zA-Z])
ищет букву, за которой следует не буква. На этом слова заканчиваются перед такими символами, как BFG9000.Этот вопрос был первым в моих результатах поиска, так что, надеюсь, я смогу сэкономить время другим!
Вот моя версия. Он добавляет пробел перед каждой английской буквой UpperCase, которая идет после строчной английской буквы, а также при необходимости делает первую букву заглавной:
Например:
thisIsCamelCase -> This Is Camel Case
this IsCamelCase -> This Is Camel Case
thisIsCamelCase123 -> This Is Camel Case123
function camelCaseToTitleCase(camelCase){
if (camelCase == null || camelCase == "") {
return camelCase;
}
camelCase = camelCase.trim();
var newText = "";
for (var i = 0; i < camelCase.length; i++) {
if (/[A-Z]/.test(camelCase[i])
&& i != 0
&& /[a-z]/.test(camelCase[i-1])) {
newText += " ";
}
if (i == 0 && /[a-z]/.test(camelCase[i]))
{
newText += camelCase[i].toUpperCase();
} else {
newText += camelCase[i];
}
}
return newText;
}
Эта реализация принимает во внимание следующие друг за другом буквы и цифры в верхнем регистре.
function camelToTitleCase(str) {
return str
.replace(/[0-9]{2,}/g, match => ` ${match} `)
.replace(/[^A-Z0-9][A-Z]/g, match => `${match[0]} ${match[1]}`)
.replace(/[A-Z][A-Z][^A-Z0-9]/g, match => `${match[0]} ${match[1]}${match[2]}`)
.replace(/[ ]{2,}/g, match => ' ')
.replace(/\s./g, match => match.toUpperCase())
.replace(/^./, match => match.toUpperCase())
.trim();
}
// ----------------------------------------------------- //
var testSet = [
'camelCase',
'camelTOPCase',
'aP2PConnection',
'superSimpleExample',
'aGoodIPAddress',
'goodNumber90text',
'bad132Number90text',
];
testSet.forEach(function(item) {
console.log(item, '->', camelToTitleCase(item));
});
Ожидаемый результат:
camelCase -> Camel Case
camelTOPCase -> Camel TOP Case
aP2PConnection -> A P2P Connection
superSimpleExample -> Super Simple Example
aGoodIPAddress -> A Good IP Address
goodNumber90text -> Good Number 90 Text
bad132Number90text -> Bad 132 Number 90 Text
Вы можете использовать такую функцию:
function fixStr(str) {
var out = str.replace(/^\s*/, ""); // strip leading spaces
out = out.replace(/^[a-z]|[^\s][A-Z]/g, function(str, offset) {
if (offset == 0) {
return(str.toUpperCase());
} else {
return(str.substr(0,1) + " " + str.substr(1).toUpperCase());
}
});
return(out);
}
"hello World" ==> "Hello World"
"HelloWorld" ==> "Hello World"
"FunInTheSun" ==? "Fun In The Sun"
Код с кучей тестовых строк здесь: http://jsfiddle.net/jfriend00/FWLuV/ .
Альтернативная версия, которая сохраняет здесь ведущие пробелы: http://jsfiddle.net/jfriend00/Uy2ac/ .
" helloWorld"
.
попробуйте эту библиотеку
http://sugarjs.com/api/String/titleize
'man from the boondocks'.titleize()>"Man from the Boondocks"
'x-men: the last stand'.titleize()>"X Men: The Last Stand"
'TheManWithoutAPast'.titleize()>"The Man Without a Past"
'raiders_of_the_lost_ark'.titleize()>"Raiders of the Lost Ark"
Если вы имеете дело с Capital Camel Case, этот фрагмент может вам помочь, а также содержит некоторые спецификации, чтобы вы могли быть уверены, что он соответствует вашему случаю.
export const fromCamelCaseToSentence = (word) =>
word
.replace(/([A-Z][a-z]+)/g, ' $1')
.replace(/([A-Z]{2,})/g, ' $1')
.replace(/\s{2,}/g, ' ')
.trim();
И характеристики:
describe('fromCamelCaseToSentence', () => {
test('does not fall with a single word', () => {
expect(fromCamelCaseToSentence('Approved')).toContain('Approved')
expect(fromCamelCaseToSentence('MDA')).toContain('MDA')
})
test('does not fall with an empty string', () => {
expect(fromCamelCaseToSentence('')).toContain('')
})
test('returns the separated by space words', () => {
expect(fromCamelCaseToSentence('NotApprovedStatus')).toContain('Not Approved Status')
expect(fromCamelCaseToSentence('GDBState')).toContain('GDB State')
expect(fromCamelCaseToSentence('StatusDGG')).toContain('Status DGG')
})
})
Ни один из приведенных выше ответов не сработал для меня, поэтому пришлось приехать с собственным велосипедом:
function camelCaseToTitle(camelCase) {
if (!camelCase) {
return '';
}
var pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.substr(1);
return pascalCase
.replace(/([a-z])([A-Z])/g, '$1 $2')
.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
.replace(/([a-z])([0-9])/gi, '$1 $2')
.replace(/([0-9])([a-z])/gi, '$1 $2');
}
Тестовые случаи:
null => ''
'' => ''
'simpleString' => 'Simple String'
'stringWithABBREVIATIONInside => 'String With ABBREVIATION Inside'
'stringWithNumber123' => 'String With Number 123'
'complexExampleWith123ABBR890Etc' => 'Complex Example With 123 ABBR 890 Etc'
Это работает для меня, проверьте это
CamelcaseToWord ("Мое имя"); // возвращает мое имя
function CamelcaseToWord(string){
return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
}
string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, "$1");
Думаю, это можно сделать просто с помощью reg exp /([a-z]|[A-Z]+)([A-Z])/g
и замены "$1 $2"
.
ILoveTheUSADope -> Я люблю наркотики США
QWERTY
он возвращается QWERT Y
.
Еще одно решение на основе RegEx.
respace(str) {
const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g;
return str.replace(regex, '$& ');
}
Приведенное выше RegEx состоит из двух похожих частей, разделенных оператором OR . Первая половина:
([A-Z])
- соответствует заглавным буквам ...(?=[A-Z][a-z])
- за которым следует последовательность прописных и строчных букв.Применительно к последовательности FOo это фактически соответствует ее букве F.
Или второй сценарий:
([a-z])
- соответствует строчным буквам ...(?=[A-Z])
- за которым следует заглавная буква.Применительно к последовательности barFoo это фактически соответствует ее букве r .
Когда все кандидаты на замену найдены, последнее, что нужно сделать, это заменить их той же буквой, но с дополнительным пробелом. Для этого мы можем использовать '$& '
в качестве замены, и она будет разрешена в совпадающую подстроку, за которой следует пробел.
const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g
const testWords = ['ACoolExample', 'fooBar', 'INAndOUT', 'QWERTY', 'fooBBar']
testWords.map(w => w.replace(regex, '$& '))
->(5) ["A Cool Example", "foo Bar", "IN And OUT", "QWERTY", "foo B Bar"]
{2,}
непосредственно перед концом второй группы, она также может обрабатываться baseURLs
(т. Е. Сохраняет «s» прикрепленным к «URL»).
Я не пробовал найти все ответы, но несколько решений, над которыми я работал, не соответствовали всем моим требованиям.
Я смог придумать кое-что, что ...
export const jsObjToCSSString = (o={}) =>
Object.keys(o)
.map(key => ({ key, value: o[key] }))
.map(({key, value}) =>
({
key: key.replace( /([A-Z])/g, "-$1").toLowerCase(),
value
})
)
.reduce(
(css, {key, value}) =>
`${css} ${key}: ${value}; `.trim(),
'')
Ниже приведена ссылка, которая демонстрирует строку из верблюжьего регистра в строку предложения с использованием регулярного выражения.
myCamelCaseSTRINGToSPLITDemo
my Camel Case STRING To SPLIT Demo
Это регулярное выражение для преобразования верблюжьего регистра в текст предложения
(?=[A-Z][a-z])|([A-Z]+)([A-Z][a-rt-z][a-z]\*)
с участием $1 $2
заменой.
Нажмите, чтобы просмотреть преобразование в регулярном выражении
Добавление еще одного решения ES6, которое мне понравилось больше после того, как я не был доволен несколькими мыслями выше.
https://codepen.io/902Labs/pen/mxdxRv?editors=0010#0
const camelize = (str) => str
.split(' ')
.map(([first, ...theRest]) => (
`${first.toUpperCase()}${theRest.join('').toLowerCase()}`)
)
.join(' ');