Insérer un espace avant les majuscules

96

J'ai une ficelle "MySites". Je veux placer un espace entre Myet Sites.

Comment puis-je faire cela dans jQuery ou JavaScript?

CLiown
la source
1
Pouvez-vous fournir plus de détails? Quelle est la forme générale des chaînes que vous souhaitez séparer? S'il ne s'agit que de cette seule chaîne, pourquoi ne pas simplement mettre l'espace manuellement?
Pointy le
2
S'il vous plaît être plus précis, je ne pense pas que quiconque puisse comprendre ce que vous demandez
Clement Herreman
1
définir le modèle auquel il doit correspondre, par exemple "un espace quand il trouve 'My' dans la chaîne" ou "ajouter un espace avant chaque caractère majuscule, à moins qu'il ne s'agisse du premier caractère", ou ....
JohnSmith
"entre MySites". Comment pouvez-vous placer un espace entre 1 chose? Je suppose que vous voulez "Mes sites" comme sortie.
Rocket Hazmat
#meagar - joli commentaire (sarcasme). N'avez-vous jamais appris que si vous n'avez rien de gentil à dire, ne dites rien du tout
carinlynchin

Réponses:

166

Vous pouvez simplement ajouter un espace avant chaque caractère majuscule et couper les espaces de début et de fin

s = s.replace(/([A-Z])/g, ' $1').trim()
user2051552
la source
Cela fonctionne également pour "1AndAbove". L'autre solution ne l'est pas. Merci!!
desaivv
1
Il «échoue» pour les acronymes, comment pourrions-nous l'empêcher d'agir lorsque 2 ou plusieurs caps consécutifs?
Toni Michel Caubet
4
@ToniMichelCaubet facile, modifier l'expression régulière comme ceci: /([A-Z]+)/g. Le + s'assurera que vous faites correspondre autant de lettres majuscules consécutives que possible.
iFreilicht
Pourquoi les parenthèses que vous utilisez pour entourer «[AZ]» sont-elles nécessaires dans ce code?
Kristina Bressler
@Kristina La parenthèse dit «Je suis une variable». Sans les parenthèses, cela donne la réponse '$ 1y $ 1ites' pour 'MySites'
user2051552
128

Cela trouvera chaque occurrence d'un caractère minuscule suivi d'un caractère majuscule, et insérera un espace entre eux:

s = s.replace(/([a-z])([A-Z])/g, '$1 $2');

Pour les cas particuliers où 2 majuscules consécutives apparaissent (par exemple: ThisIsATest), ajoutez un code supplémentaire ci-dessous:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');
Guffa
la source
3
Juste un avertissement, cela échoue pour les lettres simples "ThisIsATest" entraînera "This Is ATest".
Ceres
3
@Ceres: Bon point. Ce cas pourrait être traité en insérant à la place un espace avant toute majuscule qui n'est pas le premier caractère, mais vous avez toujours des cas qui ne peuvent pas être traités sans reconnaissance de mot, comme "RunThisSQLQuery".
Guffa
1
pour le "ThisIsATest" - (sans compter le 'RunThisSQLQuery') vous pouvez faire ceci: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
carinlynchin
Brillant! Merci!
Ami Schreiber
21

Puis-je suggérer une légère modification de la réponse actuellement acceptée:

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

Cela signifie que:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Ce qui pourrait être un peu plus utile si vous avez affaire à des noms de colonnes db (et que vous utilisez des acronymes pour certaines choses)

JosephGarrone
la source
1
Cela fonctionne parfaitement pour ce dont j'avais besoin. Il a parfaitement ajouté un espace entre les lettres majuscules mais a gardé les acronymes ensemble.
mighty_mite
6

Cela devrait insérer un espace entre chaque lettre majuscule qui n'a pas été précédée d'une lettre majuscule.

var myString = "MySites"
var newString = "";
var wasUpper = false;
for (var i = 0; i < myString.length; i++)
{
    if (!wasUpper && myString[i] == myString.toUpperCase()[i])
    {
        newString = newString + " ";
        wasUpper = true;
    }
    else
    {
        wasUpper = false;
    }
    newString = newString + myString[i];
}

newStringaura la valeur que vous souhaitez. De plus, si vous souhaitez raccourcir votre code à l'aide de regex, vous pouvez utiliser le code suivant de Javascript camelCase à Regular Form

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

regex pour trouver les minuscules - limite des majuscules puis insérer un espace

<div id='x'>ThisIsMySites</div>
$('#x').text( $('#x').text().replace(/([a-z])([A-Z])/g, "$1 $2") );

http://jsfiddle.net/uXy64/

Adam Straughan
la source
2

Voici ce que j'ai fini par utiliser pour convertir une chaîne en cas de titre, en fonction de quelques-unes des réponses ici:

str = str
  .replace(/(_|-)/g, ' ')
  .trim()
  .replace(/\w\S*/g, function(str) {
    return str.charAt(0).toUpperCase() + str.substr(1)
  })   
  .replace(/([a-z])([A-Z])/g, '$1 $2')
  .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')   

Voici un JSFiddle où vous pouvez tester votre chaîne pour voir si cela répond à vos besoins: https://jsfiddle.net/thomastasa/5236dv8t/85/


Exemples:

  • "yourStringHere" -> "Your String Here"
  • "AnotherStringHere" -> "Another String Here"
  • "someones_string" -> "Someones String"
  • "Another-String-Here" -> "Another String Here"
  • "myAWESOMEString" -> "My AWESOME String"
Thomas Stein
la source
1

Vous pouvez utiliser String#split()et une anticipation de l'alphabet en majuscule ( [A-Z]), puis Array#join()du tableau avec un espace:

let stringCamelCase = "MySites";

let string = stringCamelCase.split(/(?=[A-Z])/).join(" ");

console.log(string)

Ou, en tant que fonction d'objet chaîne:

String.prototype.cC2SC = function() {
  return this.split(/(?=[A-Z])/).join(" ");
}

console.log("MyCamelCase".cC2SC());

Luca Kiebel
la source
1

Dans une seule expression régulière, remplacez (sans découpes ni jointures) qui autorise n'importe quel caractère, pas seulement des lettres [a-z]ou[A-Z] .

const str = "MySites";
str.replace(/(?<!^)([A-Z])/, " $1"); // -> "My Sites"

Vous pouvez en savoir plus sur le look derrière (?<!^) ici .

Jose Da Silva
la source