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?


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()

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');

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)


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(); })


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"

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());


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 .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.