web-dev-qa-db-fra.com

Javascript convertit PascalCase en underscore_case

Comment puis-je convertir PascalCase chaîne en underscore_case chaîne? J'ai besoin de la conversion de points à souligner également.

par exemple. convertir

TypeOfData.AlphaBeta

dans

type_of_data_alpha_beta
51
zahmati

Vous pouvez essayer les étapes ci-dessous.

  • Capturez toutes les lettres majuscules et faites également correspondre le caractère de point optionnel précédent.

  • Puis convertissez les lettres majuscules capturées en minuscules, puis revenez pour remplacer function par un _ comme caractère précédent. Ceci sera réalisé en utilisant une fonction anonyme dans la pièce de rechange.

  • Ceci remplacerait la lettre majuscule de départ par _ + lettre minuscule.

  • Enfin, supprimer le soulignement de départ vous donnera le résultat souhaité.

    var s = 'TypeOfData.AlphaBeta';
    console.log(s.replace(/(?:^|\.?)([A-Z])/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));
    

OU

var s = 'TypeOfData.AlphaBeta';
alert(s.replace(/\.?([A-Z])/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));

aucun moyen de l'arrêter quand une Parole entière est en majuscule. par exemple. MotorRPM dans motor_rpm au lieu de motor_r_p_m? ou BatteryAAA dans battery_aaa au lieu de battery_a_a_a?

var s = 'MotorRMP';
alert(s.replace(/\.?([A-Z]+)/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));
68
Avinash Raj
str.split(/(?=[A-Z])/).join('_').toLowerCase();

de rien

var s1 = 'someTextHere';
var s2 = 'SomeTextHere';

var o1 = s1.split(/(?=[A-Z])/).join('_').toLowerCase();
var o2 = s2.split(/(?=[A-Z])/).join('_').toLowerCase();

console.log(o1);
console.log(o2);
50
cojack

Vous pouvez également utiliser lodash :

lodash.snakeCase(str);

Exemple:

_.snakeCase('TypeOfData.AlphaBeta');
// ➜ 'type_of_data_alpha_beta'

Lodash est une excellente bibliothèque pour donner des raccourcis à de nombreuses tâches js quotidiennes. Il existe de nombreuses autres fonctions de manipulation de chaînes similaires telles que camelCase, kebabCase etc.

39
Wtower
"alphaBetaGama".replace(/([A-Z])/g, "_$1").toLowerCase() // alpha_beta_gamma

Problème - Nécessité de convertir une chaîne de chameaux (telle qu'un nom de propriété) en style de soulignement pour répondre aux exigences de l'interface ou pour la méta-programmation.

Explanation Cette ligne utilise une fonctionnalité d'expressions régulières dans laquelle elle peut renvoyer un résultat correspondant (la première paire de () est $1, la seconde est $2, etc ).

Chaque correspondance de la chaîne est convertie pour avoir un trait de soulignement devant elle avec _$1 chaîne fournie. À ce stade, la chaîne ressemble à alpha_Beta_Gamma.

Pour corriger la casse, la chaîne entière est convertie en LowerCase ().

Comme toLowerCase est une opération assez coûteuse, il est préférable de ne pas le placer dans le gestionnaire de bouclage pour chaque cas de match et de l'exécuter une fois sur toute la chaîne.

Après toLowerCase la chaîne résultante est alpha_beta_gamma _ (dans cet exemple)

1
Hgehlhausen

Cette solution résout le problème des acronymes non finaux avec les solutions ci-dessus.

J'ai porté le code dans 1175208 de Python en JavaScript.

Code Javascript

function camelToSnakeCase(text) {
    return text.replace(/(.)([A-Z][a-z]+)/, '$1_$2').replace(/([a-z0-9])([A-Z])/, '$1_$2').toLowerCase()
}

Exemples de travail:

camelToSnakeCase('thisISDifficult') -> this_is_difficult

camelToSnakeCase('thisISNT') -> this_isnt

camelToSnakeCase('somethingEasyLikeThis') -> something_easy_like_this
1
Scott P.

Cela vous mènera assez loin: https://github.com/domchristie/humps

Vous devrez probablement utiliser regex replace pour remplacer le "." avec un soulignement.

1
errata
function toCamelCase(s) {
  // remove all characters that should not be in a variable name
  // as well underscores an numbers from the beginning of the string
  s = s.replace(/([^a-zA-Z0-9_\- ])|^[_0-9]+/g, "").trim().toLowerCase();

  // uppercase letters preceeded by a hyphen or a space
  s = s.replace(/([ -]+)([a-zA-Z0-9])/g, function(a,b,c) {
    return c.toUpperCase();
  });

  // uppercase letters following numbers
  s = s.replace(/([0-9]+)([a-zA-Z])/g, function(a,b,c) {
    return b + c.toUpperCase();
  });

  return s;
}

Essayez cette fonction en espérant que cela vous aidera.

1
Gabit Kemelov
"TestString".replace(/[A-Z]/g, val => "_" + val.toLowerCase()).replace(/^_/,"")

remplace toutes les majuscules par des caractères de soulignement et des minuscules, puis supprime le soulignement de base.

0
user3413723