Javascript konvertiert PascalCase in underscore_case

73

Wie kann ich einen PascalCaseString in einen underscore_caseString konvertieren ? Ich muss auch Punkte in Unterstriche umwandeln.

z.B. Konvertieren

TypeOfData.AlphaBeta

in

type_of_data_alpha_beta
zahmati
quelle
Versuchen Sie diesen Link Kumpel, es hilft Ihnen sicher jamesroberts.name/blog/2010/02/22/…
Santhucool

Antworten:

93

Sie können die folgenden Schritte ausprobieren.

  • Erfassen Sie alle Großbuchstaben und stimmen Sie auch mit dem vorhergehenden optionalen Punktzeichen überein.

  • Konvertieren Sie dann die erfassten Großbuchstaben in Kleinbuchstaben und kehren Sie zurück, um die Funktion durch ein _Vorgängerzeichen zu ersetzen . Dies wird durch die Verwendung einer anonymen Funktion im Ersatzteil erreicht.

  • Dies würde den Anfangsbuchstaben in Großbuchstaben an _+ Kleinbuchstaben ersetzen .

  • Wenn Sie den Start-Unterstrich entfernen, erhalten Sie die gewünschte Ausgabe.

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

ODER

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

jede Möglichkeit, es zu stoppen, wenn ein ganzes Wort in Großbuchstaben geschrieben ist. z.B. MotorRPMin motor_rpmstatt motor_r_p_m? oder BatteryAAAin battery_aaastatt battery_a_a_a?

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

Avinash Raj
quelle
Vielen Dank, wie auch immer, wenn ein ganzes Wort in Großbuchstaben geschrieben ist. z.B. MotorRMPin motor_rpmstatt motor_r_p_m? oder BatteryAAAin battery_aaastatt battery_a_a_a.
Zahmati
1
alert(s.replace(/\.?([A-Z]+)/g, function (x,y){return "_" + y.toLowerCase()}).replace(/^_/, ""));
Avinash Raj
Die obigen Lösungen schlagen mit "attributeGUILabel" fehl, das in "attribute_gui_label" konvertiert werden soll.
Scott P.
Ich habe eine Lösung gefunden, die funktioniert. Siehe meine Antwort unten
Scott P.
2
Ich würde es vorziehen, ohne Rückrufs.replace(/\.?([A-Z]+)/g, '_$1').toLowerCase().replace(/^_/, "")
l00k
84
str.split(/(?=[A-Z])/).join('_').toLowerCase();

bitte

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

Cojack
quelle
Es funktioniert nicht mit 'SomeTextHere' wegen des führenden Leerzeichens. Hinzufügen eines trimvor dem splitlöst es.
Mason
51

Alternativ mit lodash :

lodash.snakeCase(str);

Beispiel:

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

Lodash ist eine feine Bibliothek Verknüpfung zu vielen alltäglichen js tasks.There sind viele andere ähnliche String - Manipulation Funktionen zu geben , wie zum Beispiel camelCase, kebabCaseusw.

Wtower
quelle
3
Wow, danke dafür, ich habe mein eigenes toSnakeCase, toTitleCase (_. StartCase), toCamelCase verwendet. Dank dessen bin ich jetzt zu lodash gewechselt und es funktioniert viel besser als meins! Ich hatte keine Ahnung, dass lodash das hatte!
Noitidart
11
"alphaBetaGama".replace(/([A-Z])/g, "_$1").toLowerCase() // alpha_beta_gamma

Problem - Sie müssen eine Camel-Case-Zeichenfolge (z. B. einen Eigenschaftsnamen) in einen Unterstrich konvertieren, um die Schnittstellenanforderungen zu erfüllen, oder für die Metaprogrammierung.

Erläuterung Diese Zeile verwendet eine Funktion regulärer Ausdrücke, mit der ein übereinstimmendes Ergebnis zurückgegeben werden kann (erstes Paar von () ist $1, zweites ist $2usw.).

Jede Übereinstimmung in der Zeichenfolge wird so konvertiert, dass ein Unterstrich mit der _$1bereitgestellten Zeichenfolge vorangestellt wird. An diesem Punkt sieht die Zeichenfolge so aus alpha_Beta_Gamma.

Um die Großschreibung zu korrigieren, wird die gesamte Zeichenfolge in LowCase () konvertiert.

Da toLowerCase eine ziemlich teure Operation ist, ist es am besten, sie nicht für jeden Match-Case in den Loop-Handler zu legen und sie einmal für die gesamte Zeichenfolge auszuführen.

Danach toLowerCaseist die resultierende Zeichenfolge alpha_beta_gamma(in diesem Beispiel)

Hgehlhausen
quelle
10

Diese Lösung löst das nicht nachlaufende Akronymproblem mit den oben genannten Lösungen

Ich habe den Code in 1175208 von Python nach JavaScript portiert .

Javascript Code

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

Arbeitsbeispiele:

camelToSnakeCase('thisISDifficult') -> this_is_difficult

camelToSnakeCase('thisISNT') -> this_isnt

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

Damit kommen Sie ziemlich weit: https://github.com/domchristie/humps

Sie müssen wahrscheinlich Regex Replace verwenden, um das "." mit einem Unterstrich.

Errata
quelle
1
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;
}

Probieren Sie diese Funktion aus und hoffen Sie, dass sie hilft.

Gabit Kemelov
quelle
5
Ist es nicht falsch in Richtung? CamelToUnderscorewird gebraucht.
Zahmati
0
"TestString".replace(/[A-Z]/g, val => "_" + val.toLowerCase()).replace(/^_/,"")

Ersetzt alle Großbuchstaben durch einen Unterstrich und Kleinbuchstaben und entfernt dann den führenden Unterstrich.

user3413723
quelle
0

Ich fand dies aber ich bearbeiten es so Ihre Frage entspricht.

const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/,'')
Ahmed Khaled
quelle