84 votes

Regex pour séparer la casse des chameaux

J'ai une expression régulière en JavaScript pour diviser ma chaîne de caractères en majuscules en utilisant le code suivant (que j'ai obtenu par la suite à partir de aquí ):

"MyCamelCaseString"
    .replace(/([A-Z])/g, ' $1')
    .replace(/^./, function(str){ return str.toUpperCase(); })

C'est ainsi que l'on revient :

"My Camel Case String"

Ce qui est une bonne chose. Cependant, je veux passer à la vitesse supérieure. Quelqu'un pourrait-il m'aider avec une expression rationnelle qui séparera si, et seulement si, le premier caractère est en minuscule et le second en majuscule.

Ainsi, l'exemple ci-dessus sera le résultat que j'attends, mais si je le fais :

"ExampleID"

Ensuite, on me renvoie :

"Example ID"

Au lieu de

"Example I D"

Puisqu'il se sépare à chaque majuscule et ignore tout ce qui la précède.

J'espère que cela a du sens ! Et merci :).

151voto

Michiel Dral Points 1835

À mon avis, il s'agit de remplacer /([A-Z])/ con /([a-z])([A-Z])/ y ' $1' con '$1 $2'

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

/([a-z0-9])([A-Z])/ pour les nombres comptant comme des caractères minuscules

console.log("MyCamelCaseStringID".replace(/([a-z0-9])([A-Z])/g, '$1 $2'))

45voto

Adrian Salazar Points 2573
"MyCamelCaseString".replace(/([a-z](?=[A-Z]))/g, '$1 ')

des sorties :

"My Camel Case String"

28voto

tujamaica Points 271

Si vous voulez un tableau de mots en minuscules :

"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase());

Si vous voulez une chaîne de mots en minuscules :

"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase()).join(' ');

Si vous souhaitez séparer les mots tout en conservant l'enveloppe :

"myCamelCaseString".replace(/([a-z])([A-Z])/g, '$1 $2')

18voto

Eugene Mironichev Points 456

Les chaînes en camelCase comprennent parfois des abréviations, par exemple :

PDFSplitAndMergeSamples
PDFExtractorSDKSamples
PDFRendererSDKSamples
BarcodeReaderSDKSamples

Dans ce cas, la fonction suivante fonctionnera, elle divise la chaîne en laissant les abréviations comme des chaînes séparées :

function SplitCamelCaseWithAbbreviations(s){
   return s.split(/([A-Z][a-z]+)/).filter(function(e){return e});
}

Exemple :

function SplitCamelCaseWithAbbreviations(s){
   return s.split(/([A-Z][a-z]+)/).filter(function(e){return e});
}

console.log(SplitCamelCaseWithAbbreviations('PDFSplitAndMergeSamples'));
console.log(SplitCamelCaseWithAbbreviations('PDFExtractorSDKSamples'));
console.log(SplitCamelCaseWithAbbreviations('PDFRendererSDKSamples'));
console.log(SplitCamelCaseWithAbbreviations('BarcodeReaderSDKSamples'));

5voto

Richtopia Points 350

J'ai constaté qu'aucune des réponses à cette question ne fonctionnait vraiment dans tous les cas et pas du tout pour les chaînes unicode, alors en voici une qui fait tout, y compris la séparation des tirets et des underscores.

let samples = [
  "ThereIsWay_too  MuchCGIInFilms These-days",
  "UnicodeCanBeCAPITALISEDTooYouKnow",
  "CAPITALLetters at the StartOfAString_work_too",
  "As_they_DoAtTheEND",
  "BitteWerfenSie-dieFußballeInDenMüll",
  "IchHabeUberGesagtNichtÜber",
  "2BeOrNot2Be",
  "ICannotBelieveThe100GotRenewed. It-isSOOOOOOBad"
];

samples.forEach(sample => console.log(sample.replace(/([^[\p{L}\d]+|(?<=[\p{Ll}\d])(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}[\p{Ll}\d])|(?<=[\p{L}\d])(?=\p{Lu}[\p{Ll}\d]))/gu, '-').toUpperCase()));

Si vous ne voulez pas que les chiffres soient traités comme des lettres minuscules, alors.. :

let samples = [
  "2beOrNot2Be",
  "ICannotBelieveThe100GotRenewed. It-isSOOOOOOBad"
];

samples.forEach(sample => console.log(sample.replace(/([^\p{L}\d]+|(?<=\p{L})(?=\d)|(?<=\d)(?=\p{L})|(?<=[\p{Ll}\d])(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}\p{Ll})|(?<=[\p{L}\d])(?=\p{Lu}\p{Ll}))/gu, '-').toUpperCase()));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X