Javascript konvertiert PascalCase in underscore_case


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(/^_/, ""));


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


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.


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)


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


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.


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.


0

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

const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/,'')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.