Ik heb geprobeerd een JavaScript regex-commando te krijgen om iets als "thisString"
in "This String"
te veranderen, maar het beste wat ik heb gekregen is het vervangen van een letter, resulterend in iets als "Thi String"
of "This tring"
. Enig idee?
Om te verduidelijken dat ik de eenvoud van het maken van een hoofdletter aankan, ik ben gewoon niet zo sterk met RegEx en het splitsen van "somethingLikeThis"
in "something Like This"
is waar ik problemen mee heb.
Antwoord 1, autoriteit 100%
"thisStringIsGood"
// insert a space before all caps
.replace(/([A-Z])/g, ' $1')
// uppercase the first character
.replace(/^./, function(str){ return str.toUpperCase(); })
toont
This String Is Good
Antwoord 2, autoriteit 21%
Ik had hier een nutteloze interesse in, vooral bij het afhandelen van hoofdletters, zoals in xmlHTTPRequest. De vermelde functies zouden “Xml H T T P Request” of “Xml HTTPRequest” produceren, de mijne produceert “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(); })
}
Er is ook een String.prototype-versie in het kort.
Antwoord 3, autoriteit 5%
Dit kan beknopt worden gedaan met regex lookahead (live demo):
function splitCamelCaseToString(s) {
return s.split(/(?=[A-Z])/).join(' ');
}
(Ik dacht dat de g
(algemene) vlag nodig was, maar vreemd genoeg is dat in dit specifieke geval niet het geval.)
Het gebruik van vooruitkijken met split
zorgt ervoor dat de overeenkomende hoofdletter niet wordt verbruikt en vermijdt het omgaan met een voorloopspatie als UpperCamelCase iets is waarmee u te maken krijgt. Om de eerste letter van elk een hoofdletter te geven, kunt u het volgende gebruiken:
function splitCamelCaseToString(s) {
return s.split(/(?=[A-Z])/).map(function(p) {
return p.charAt(0).toUpperCase() + p.slice(1);
}).join(' ');
}
De map
array-methode is een ES5-functie, maar je kunt deze nog steeds gebruiken in oudere browsers met een code van MDC. Als alternatief kunt u de array-elementen herhalen met behulp van een for
-lus.
Antwoord 4, autoriteit 5%
Ik denk dat dit zowel opeenvolgende hoofdletters als eenvoudige camelCase moet kunnen verwerken.
Bijvoorbeeld: someVariable => een variabele, maar ABCCode != A B C Code.
De onderstaande regex werkt op uw voorbeeld, maar ook op het gebruikelijke voorbeeld van afkortingen in 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"
U kunt ook aanpassen zoals hierboven om het eerste teken met een hoofdletter te schrijven.
Antwoord 5, autoriteit 3%
Lodashhandelt dit netjes af met _.startCase()
Antwoord 6, autoriteit 3%
function spacecamel(s){
return s.replace(/([a-z])([A-Z])/g, '$1 $2');
}
spacecamel(‘somethingLikeThis’)
// geretourneerde waarde: zoiets als dit
Antwoord 7
Een oplossing die ook met getallen omgaat:
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 + ' ';
}
)
}
Hier getest [JSFiddle, geen bibliotheek.IE niet geprobeerd]; zou redelijk stabiel moeten zijn.
Antwoord 8
Probeer deze oplossing hier –
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;
Antwoord 9
Als je niet om oudere browsers geeft (of het niet erg vindt om er een fallback reduce-functie voor te gebruiken), kan dit zelfs strings zoals ‘xmlHTTPRequest’ (maar zeker het soort ‘ XMLHTTPRequest’ kan niet).
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(' ');
}
Antwoord 10
Mijn versie
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"
Antwoord 11
const value = 'camelCase';
const map = {};
let index = 0;
map[index] = [];
for (let i = 0; i < value.length; i++) {
if (i !== 0 && value[i] === value[i].toUpperCase()) {
index = i;
map[index] = [];
}
if (i === 0) {
map[index].push(value[i].toUpperCase());
} else {
map[index].push(value[i]);
}
}
let resultArray = [];
Object.keys(map).map(function (key, index) {
resultArray = [...resultArray, ' ', ...map[key]];
return resultArray;
});
console.log(resultArray.join(''));
Antwoord 12
Geen regex, maar handig om eenvoudige en oude technieken als deze te kennen:
var origString = "thisString";
var newString = origString.charAt(0).toUpperCase() + origString.substring(1);