Как я могу преобразовать строку типа «helloThere» или «HelloThere» в «Hello There» в JavaScript?
javascript
regex
string
HyderA
источник
источник
Ответы:
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 :
Пример:
_.startCase('helloThere'); // ➜ 'Hello There'
Lodash - прекрасная библиотека для быстрого доступа ко многим повседневным задачам js. Есть много других подобных функций манипулирования строками, таких как
camelCase
иkebabCase
т. Д.источник
hello world
то вывод должен бытьHello There
: В этом случае loadash не поможет.hello world
вHello World
lodash.com/docs/4.17.15#upperFirsthello 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")
http://jsfiddle.net/PeYYQ/
Вход:
Выход:
источник
Пример без побочных эффектов.
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'
источник
Это работает для меня, проверьте это
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
Это регулярное выражение для преобразования верблюжьего регистра в текст предложения
с участием
$1 $2
заменой.Нажмите, чтобы просмотреть преобразование в регулярном выражении
источник
Введите javaScript
Выходной сценарий Java
var text = 'javaScript'; text.replace(/([a-z])([A-Z][a-z])/g, "$1 $2").charAt(0).toUpperCase()+text.slice(1).replace(/([a-z])([A-Z][a-z])/g, "$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(' ');
источник