Regex: konvertieren camel-case zu Großbuchstaben mit Unterstrichen
Welchen regulären Ausdruck kann benutzt werden, um die folgenden Konvertierungen?
City -> CITY
FirstName -> FIRST_NAME
DOB -> DOB
PATId -> PAT_ID
RoomNO -> ROOM_NO
Den folgenden fast funktioniert, es fügt nur einen zusätzlichen Unterstrich an den Anfang des Wortes:
var rgx = @"(?x)( [A-Z][a-z,0-9]+ | [A-Z]+(?![a-z]) )";
var tests = new string[] { "City",
"FirstName",
"DOB",
"PATId",
"RoomNO"};
foreach (var test in tests)
Console.WriteLine("{0} -> {1}", test,
Regex.Replace(test, rgx, "_$0").ToUpper());
//output:
//City -> _CITY
//FirstName -> _FIRST_NAME
//DOB -> _DOB
//PATId -> _PAT_ID
//RoomNO -> _ROOM_NO
- Es scheint zu den führenden Unterstrich ist konsequent Hinzugefügt, also warum gehst du nicht einfach isolieren Sie diese aus?
- Auf der Suche nach genau das Gegenteil: Regex: konvertieren caps mit Unterstrichen, um alle camel-case
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fließt von John M Gant Idee, das hinzufügen von Unterstrichen dann Kapital, denke ich, dass dieser reguläre Ausdruck sollte funktionieren:
ersetzen mit:
Können Sie benennen Sie die capture-Zonen, um den ersetzen-string ein wenig schöner zu Lesen. Nur $1 oder $3 sollte einen Wert haben, gleichen Sie mit $2 und $4. Die Allgemeine Idee ist, fügen Sie Unterstriche, wenn:
Hoffe, das hilft.
Ich schlage vor, eine einfache Regex einfügen der Unterstrich und dann
string.ToUpper()
konvertieren in Großbuchstaben.Es sind zwei Operationen statt, aber für mich ist es viel einfacher zu Lesen, als eine große, komplizierte regex ersetzen.
@"(\p{L})(\p{Lu})(\p{Ll})", "$1_$2$3"
Updates, aber es funktioniert nicht auf RoomNO.Kann ich wahrscheinlich kommen mit einem regex, der wird es tun... aber ich glaube, eine transformative regex kann nicht die richtige Antwort. Ich schlage vor, Sie nehmen, was Sie bereits haben und nur hacken das erste Zeichen (der Unterstrich am Anfang) ab und der Ausgang. Die CPU-Zeit ist wahrscheinlich das gleiche oder weniger, dass die Art und Weise, und Ihre Codierung Zeit belanglos.
Versuchen:<--fehlgeleiteten und gescheiterten Versuch zu träumen, was ich sagte, war eine dumme Idee.(?x)(.)( [A-Z][a-z,0-9]+ | [A-Z]+(?![a-z]) )
und ändern Sie den code nach der Ausgabe $0_$1 anstelle von _$0Scheint, wie Schienen es tut mit mehr als einem regulären Ausdruck.
Ich weiß, das ist eine alte Frage, aber es ist immer noch etwas, das kommt oft, so habe ich beschlossen, meine eigenen Ansatz, um es.
Anstatt zu versuchen, es mit Ersatz, die Idee ist zu finden, alle "Wörter" in der Zeichenfolge und dann konvertieren Sie Sie in Großbuchstaben und join:
Nicht sonderlich prägnant, aber können Sie konzentrieren sich auf die Definition, was ein "Wort" ist, genau, anstatt zu kämpfen mit Anker, Separatoren und so weiter. In diesem Fall habe ich definiert ein Wort als etwas, beginnend mit einem Großbuchstaben gefolgt von entweder einer Sequenz von Großbuchstaben oder einer Mischung aus klein-und Großbuchstaben. Könnte ich haben wollte, separate Sequenzen von Ziffern, zu.
"^(\p{Lu}(?:\p{Lu}*|\p{Ll}*)|\d+)*$"
würde den trick tun. Oder vielleicht wollte ich die Ziffern mit einem Teil der früheren groß-word, dann würde ich das tun"^(\p{Lu}(?:[\p{Lu}\d]*|[\p{Ll}\d]*))*$"
.Gibt es keine javascript-Antwort hier, so können auch fügen Sie hinzu.
( Dies ist mit dem regex von @John McDonald )