2017-03-07 7 views
2

Ich stieß auf einen Fall, in dem ich String pro Wort teilen muss, das in Kamelfall ist. Ich bin der Umsetzung des geteilten Prozess ähnlich dem answer this question dieses Muster verwenden:Geteilte Wörter auf gewünschte Regionen

split(/(?=[A-Z])/) 

Alles ist gut, bis ich diesen Test Set begegnet:

  • SalaryGrade - Gehalt Grade
  • Parentchild - Eltern-Kind
  • Wartung - Wartung
  • RemittanceSPD - Überweisungs-SPD
  • FBIAgent - FBI-Agent
  • FBIAgentNYDepartment - FBI-Agent NY Abteilung

One bis zu drei Werke in Ordnung, aber vier Minuten vor sechs sollten "Remittance SPD", "FBI-Agent", "FBI-Agent NY Department" sein bzw. .

Wie kann ich die Regionen so auswählen, dass aufeinanderfolgende Großbuchstaben als ein Wort und die letzte Sequenz als Anfang des nächsten Wortes behandelt wird? Ich bin nicht so begeistert von One-Liner Regex, um ehrlich zu sein, und ich verliere alle Hoffnung. Ich plane hier eine Brute-Force-Schleife, wenn nicht nur über diese Leistung.

EDIT: Ich möchte, dass Wörter mit nicht nachfolgenden Großbuchstaben und solche mit nachfolgenden Großbuchstaben mit dieser Funktion zufrieden sind, im Gegensatz zu den anderen Fragen über das Teilen von Strings hier auf dieser Website.

+1

Zu schlecht JS unterstützt Lookbehind nicht, oder '/ (? <= [Az]) (? = [AZ]) /' wäre genug gewesen – Aaron

+2

Probieren Sie 'str.match (/ [AZ] + (? ! [az]) | [AZ] [az] */g) ' –

+0

@Aaron Ich habe gerade auch den Look-Behind getestet, vor ein paar Minuten, und ja, schade. Deshalb denke ich daran, es zu wiederholen. – Gideon

Antwort

2

Sie einen hier passende Ansatz verwenden:

str.match(/[A-Z]+(?![a-z])|[A-Z][a-z]*/g) 

Siehe regex demo

Einzelheiten:

  • [A-Z]+(?![a-z]) - 1+ Groß ASCII-Buchstaben nicht mit einem Klein ASCII Buchstaben gefolgt
  • | - oder
  • [A-Z][a-z]* - ein Groß ASCII nachgestellten Buchstaben mit 0+ Klein ASCII Brief

var ss = ['SalaryGrade','ParentChild','Maintenance','RemittanceSPD','FBIAgent','FBIAgentNYDepartment']; 
 
var rx = /[A-Z]+(?![a-z])|[A-Z][a-z]*/g; 
 
for (var s = 0; s < ss.length; s++) { 
 
    console.log("Testing: ", ss[s], "... "); 
 
    console.log("Matched: ", JSON.stringify(ss[s].match(rx))); 
 
}

Beachten Sie, dass im Falle FBIAgent, die FBI werden nur mit [A-Z]+(?![a-z]) aufgrund der Backtracking abgestimmt, die ausgelöst wird, nachdem die Regex-Engine die FBIA Großbuchstaben mit [A-Z]+ ergreift: es rückt auf die Position zurück, wo der Großbuchstabe nicht mit einem Kleinbuchstaben gefolgt wird, und erhalten Sie FBI Übereinstimmung, und die A Buchstaben müssen bei der nächsten Iteration konsumiert werden.

-1

Folgendes sollte helfen:

/(?=[A-Z][a-z])/ 
+0

Funktioniert nicht, wenn die Großbuchstaben auf dem ned sind, z. 'ÜberweisungSPD' – Gideon