2010-12-14 9 views
2

ist eine Fortsetzung meiner ursprünglichen Frage: Perl- How do I insert a space before each capital letter except for the first occurrence or existing?Wie füge ich ein Leerzeichen zwischen einem alphanumerischen Zeichen und einem numerischen Zeichen ein? Diese

konnte ich ein gewünschtes Ergebnis des Einsetzens Raum zwischen Kappen mit nur Buchstaben in der Zeichenkette erreichen:

my $camel ="SomeCamel IsEnteringText"; 
$camel =~ s/(?<=[a-z])(?=[A-Z])/ /g; 
$camel =~ s/([^[:space:]]+)/\u$1/g; 

Drucke:

Einige Kamele geben Text ein

Aber, wenn Zahlen vorliegen, lief ich in Fragen:

my $camel ="Some 440Camel220 IsEntering100Text Nogo"; 
$camel =~ s/(?<=[a-z])(?=[A-Z])/ /g; 
$camel =~ s/([^[:space:]]+)/\u$1/g; 

Drucke:

Einige 440Camel220 Ist Entering100Text Nogo

Wunsch:

Einige 440 Camel 220 Eingabe von 100 Text Nogo

Also, wie füge ich jetzt ein Leerzeichen zwischen den Buchstaben und den Zahlen ein ?.

Antwort

2

Veränderung der erste Wechsel zu sein:

$camel =~ s/(?<=[a-z])(?=[A-Z0-9])|(?<=[0-9])(?=[A-Z])/ /g; 

Siehe auch perldoc perlre.

+0

Ich habe dieses als die Antwort gewählt, weil ich nur zwei Zeilen nicht vier verwenden muss, um mein gewünschtes Ergebnis zu erhalten. Obwohl ich zugeben muss, arbeite ich noch daran, herauszufinden, was dort passiert! – DulcimerDude

+0

Er macht im Grunde dasselbe wie meine Antwort. Die erste Hälfte der Gruppierung (getrennt durch '|') entspricht Übergängen zwischen Kleinbuchstaben und EHRER Großbuchstaben oder Ziffern, und die zweite Hälfte entspricht Übergängen zwischen Zahlen und Großbuchstaben. Diese Version wird 'a440' nicht in' a440' verwandeln; mein Wille. Ich weiß nicht, ob das wichtig ist. Ich denke auch, dass das äußerste "(?: ...)" unnötig ist. Tatsächlich macht es in diesem Ausdruck nichts. – mkb

+0

Ich muss etwas Zeit verbringen und meinen Kopf darum wickeln. Ich denke, dass ich es ein bisschen verstehe. Ich bin dran, damit zu spielen, bis ich tatsächlich in der Lage sein werde, einen selbst zu schreiben (außerhalb der Einzelspieler)! Vielen Dank noch einmal ... – DulcimerDude

0

Fügen Sie die folgenden zwei Substitutionen:

$camel =~ s/(?<=[0-9])(?=[a-z])/ /ig; 
$camel =~ s/(?<=[a-z])(?=[0-9])/ /ig; 

Die ersten Einsätze einen Raum an jedem Übergang zwischen einer Ziffer und einem Buchstaben. Der Modifizierer i am Ende macht den Ausdruck case-insensitive. Die zweite macht das Gegenteil.

+0

Danke, das gut funktioniert und ich konnte verstehen, was los war. Ich wünschte, ich könnte sowohl Ihre als auch eugene ys als Antworten wählen, weil sie für mich beide wertvoll sind. – DulcimerDude

Verwandte Themen