2016-07-10 9 views
4

ich bei this link und this link und einige andere ausgesehen haben in Großbuchstaben, aber keiner von ihnen scheinen dies nur mit reinen Regex zu lösen (... nicht ersetzen verwenden, etc).Javascript regex an dem Punkt, zu spalten, wo Klein Änderungen

Eingangs string: "Vehicle ServicesAUTOMATED GAS DISPENSER"

Meine gewünschte Ausgabe ist: ["Vehicle Services", "AUTOMATED GAS DISPENSER"]

Hier ist mein Versuch:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER' 
 
console.log(str.split(/(?=[a-z][A-Z])/))

[ 'Fahrzeug-Service', 'sAUTOMATED GAS DISPENSER']

Ich habe eine Lösung unten, aber ich mag es nicht, weil es eine zusätzliche "Ersetzen" -Methode verwendet. Ich suche nach einem reinen Regex-basierten Split.

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER' 
 
console.log(str.replace(/([a-z])(?=[A-Z])/, "$1_").split('_'))

[ 'Vehicle Services', 'AUTOMATISIERTES GAS DISPENSER']

Update: Meine Forderung ist einfach die Eingabezeichenfolge zu spalten, wie in der angegebenen Post - wie gezeigt, wenn der Fall in Großbuchstaben umschlägt, bleibt es in Großbuchstaben bis zum Ende.

+0

habe es teilweise [JSFiddle] (https://jsfiddle.net/r3344m3p/) zu arbeiten . – Rajesh

+0

Ihr Beispiel zeigt, dass das, was Sie "Kleinbuchstaben" nennen, Großbuchstaben enthalten kann. Sie sollten genau erklären, was Kleinbuchstaben ausmacht. Wie viele Hauptstädte kann es haben? Kann es nur auf dem ersten Buchstaben stehen? – Touffy

+0

@Touffy - wie im Titel des Beitrags angegeben, muss die Teilung an der Stelle erfolgen, an der sich der Fall von unten nach oben ändert. – mpprdev

Antwort

0

JavaScript unterstützt keine Lookbehinds. Wenn Sie also versuchen, den leeren Platz zwischen zwei Zeichen aufzuteilen, gibt es keine Möglichkeit, das Zeichen zu validieren, bevor der leere Bereich ein bestimmtes Zeichen ist.Aber das Erfassen von Klammern kann auch Elemente an das resultierende Array von split anhängen. So können Sie eine Lösung wie folgt zu erstellen:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER' 
var ar = str.split(/(.*[a-z])(?=[A-Z])/); 
//result is ["", "Vehicle Services", "AUTOMATED GAS DISPENSER"] 
ar.shift();//get rid of the leading empty element 
console.log(ar);//["Vehicle Services", "AUTOMATED GAS DISPENSER"] 

Ein weiterer Ansatz das leere Spiel am Ende des resultierenden Arrays zu haben wäre nicht am Anfang, da Split eine eingebauter, Parameter zu begrenzen die Anzahl der Elemente haben des resultierenden Arrays, also würden wir AUTOMATED GAS DISPENSER als Trennzeichen verwenden, das Sie zwischen den einfangenden Klammern setzen würden, dann hätten wir das leere Element am Ende des resultierenden Arrays, das wir einfach entfernen können, ohne pop:

aufzurufen
var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER' 
var ar = str.split(/((?:[A-Z]{2,}\s*)+)/,2); 
console.log(ar);//["Vehicle Services", "AUTOMATED GAS DISPENSER"] 

Aber wenn Sie mit einem Stück Logik kommen könnte, die ein leeres identifizieren kann Raum auf dem mit einem Look-Ahead allein zu spalten, ohne nach hinten zu schauen haben, dann könnte man so etwas schreiben:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER' 
var ar = str.split(/(?=AUTO)/); 
console.log(ar);//["Vehicle Services", "AUTOMATED GAS DISPENSER"] 
1

Dies ist nicht perfekt, aber es ist das Beste, was ich für einen einzigen Split ohne irgendeine Kennung zwischen den beiden kommen könnte.

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'; 
var res = str.split(/([A-Z\s]+$)/); 
console.log(res); 

Das einzige Problem ist, dass es ein zusätzliches Array-Element mit einer leeren Zeichenkette verläßt. Sie können es abbrechen oder einfach ignorieren, wenn Sie immer nur zwei Array-Elemente erwarten.

JSFiddle https://jsfiddle.net/2ex4cuno/4/

Wie @rid erwähnt, können Sie dies auf die Spaltung hinzufügen, um nur die beiden Ergebnisse zu erhalten (wieder, Sie gehen davon aus immer nur erwarten 2, die ich nehme an, Sie würden).

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'; 
var res = str.split(/([A-Z\s]+$)/, 2); 
console.log(res); 
+0

ah, gute Idee. Ich werde aktualisieren. –

+0

Das macht Sinn. Ich habe noch nie mit einem Regex geteilt. Danke für diese Erklärung. –

+0

Es sollte wegen der \ s drin sein. https://jsfiddle.net/2ex4cuno/1/ –

0

Zusätzlicher Ansatz RegExp.exec Funktion:

var str = "Vehicle ServicesAUTOMATED GAS DISPENSER", 
    parts = /([a-zA-Z ]+?)([A-Z ]+)$/.exec(str); 

console.log(parts[1]); // Vehicle Services 
console.log(parts[2]); // AUTOMATED GAS DISPENSER 
1

Wenn Ihr Anwendungsfall ein gemischter Fall Zeichenfolge von einem All-Groß String gefolgt ist, dann wäre eine Idee match zu verwenden, anstatt split, dann lesen der Ergebnisse aus den erfassten Gruppen:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'; 
 
var result = str.match(/(.*[a-z])((?=[A-Z]).*)/); 
 

 
console.log([result[1], result[2]]);