Willkommen bei Unicode
Alle diese Lösungen sind für modernen Text im Wesentlichen falsch. Sie müssen etwas verwenden, das den Fall versteht. Da Bob nach anderen Sprachen gefragt hat, gebe ich ein paar für Perl.
Ich biete vier Lösungen an, die vom schlechtesten bis zum besten reichen. Nur der Beste hat immer Recht. Die anderen haben Probleme. Hier ist ein Testlauf, der Ihnen zeigt, was funktioniert und was nicht und wo. Ich habe Unterstriche verwendet, damit Sie sehen können, wo die Leerzeichen platziert wurden, und ich habe alles, was falsch ist, als falsch markiert.
Testing TheLoneRanger
Worst: The_Lone_Ranger
Ok: The_Lone_Ranger
Better: The_Lone_Ranger
Best: The_Lone_Ranger
Testing MountMᶜKinleyNationalPark
[WRONG] Worst: Mount_MᶜKinley_National_Park
[WRONG] Ok: Mount_MᶜKinley_National_Park
[WRONG] Better: Mount_MᶜKinley_National_Park
Best: Mount_Mᶜ_Kinley_National_Park
Testing ElÁlamoTejano
[WRONG] Worst: ElÁlamo_Tejano
Ok: El_Álamo_Tejano
Better: El_Álamo_Tejano
Best: El_Álamo_Tejano
Testing TheÆvarArnfjörðBjarmason
[WRONG] Worst: TheÆvar_ArnfjörðBjarmason
Ok: The_Ævar_Arnfjörð_Bjarmason
Better: The_Ævar_Arnfjörð_Bjarmason
Best: The_Ævar_Arnfjörð_Bjarmason
Testing IlCaffèMacchiato
[WRONG] Worst: Il_CaffèMacchiato
Ok: Il_Caffè_Macchiato
Better: Il_Caffè_Macchiato
Best: Il_Caffè_Macchiato
Testing MisterDženanLjubović
[WRONG] Worst: MisterDženanLjubović
[WRONG] Ok: MisterDženanLjubović
Better: Mister_Dženan_Ljubović
Best: Mister_Dženan_Ljubović
Testing OleKingHenryⅧ
[WRONG] Worst: Ole_King_HenryⅧ
[WRONG] Ok: Ole_King_HenryⅧ
[WRONG] Better: Ole_King_HenryⅧ
Best: Ole_King_Henry_Ⅷ
Testing CarlosⅤºElEmperador
[WRONG] Worst: CarlosⅤºEl_Emperador
[WRONG] Ok: CarlosⅤº_El_Emperador
[WRONG] Better: CarlosⅤº_El_Emperador
Best: Carlos_Ⅴº_El_Emperador
Übrigens hat fast jeder hier den ersten Weg gewählt, den mit "Schlimmsten" gekennzeichneten. Einige haben den zweiten Weg mit "OK" gewählt. Aber niemand vor mir hat Ihnen gezeigt, wie man entweder den "besseren" oder den "besten" Ansatz macht.
Hier ist das Testprogramm mit seinen vier Methoden:
#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
# First I'll prove these are fine variable names:
my (
$TheLoneRanger ,
$MountMᶜKinleyNationalPark ,
$ElÁlamoTejano ,
$TheÆvarArnfjörðBjarmason ,
$IlCaffèMacchiato ,
$MisterDženanLjubović ,
$OleKingHenryⅧ ,
$CarlosⅤºElEmperador ,
);
# Now I'll load up some string with those values in them:
my @strings = qw{
TheLoneRanger
MountMᶜKinleyNationalPark
ElÁlamoTejano
TheÆvarArnfjörðBjarmason
IlCaffèMacchiato
MisterDženanLjubović
OleKingHenryⅧ
CarlosⅤºElEmperador
};
my($new, $best, $ok);
my $mask = " %10s %-8s %s\n";
for my $old (@strings) {
print "Testing $old\n";
($best = $old) =~ s/(?<=\p{Lowercase})(?=[\p{Uppercase}\p{Lt}])/_/g;
($new = $old) =~ s/(?<=[a-z])(?=[A-Z])/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Worst:", $new;
($new = $old) =~ s/(?<=\p{Ll})(?=\p{Lu})/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Ok:", $new;
($new = $old) =~ s/(?<=\p{Ll})(?=[\p{Lu}\p{Lt}])/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Better:", $new;
($new = $old) =~ s/(?<=\p{Lowercase})(?=[\p{Uppercase}\p{Lt}])/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Best:", $new;
}
Wenn Sie in diesem Datensatz das gleiche Ergebnis wie "Best" erzielen können, wissen Sie, dass Sie es richtig gemacht haben. Bis dahin hast du nicht. Niemand hier hat es besser gemacht als "Ok", und die meisten haben es "am schlechtesten" gemacht. Ich freue mich darauf, jemanden zu sehen, der den richtigen post-Code veröffentlicht.
Ich stelle fest, dass der Hervorhebungscode von StackOverflow wieder miserabel dumm ist. Sie machen alle die gleichen alten Lahmheiten wie (die meisten, aber nicht alle) der anderen armen Ansätze, die hier erwähnt wurden. Ist es nicht lange her, ASCII zur Ruhe zu bringen? Es macht keinen Sinn mehr und so zu tun, als wäre es alles, was Sie haben, ist einfach falsch. Es macht für schlechten Code.