Worte von UpperCase in TitleCase wandeln

Hallo in die Runde.

Gegeben ist ein String mit einem Text, der Namen in Groschreibung (UpperCase) enthalten kann. In diesem Text sollen nur diese Worte in Groschreibung in TitleCase (also nur Anfangsbuchstabe gro) gewandelt werden.

Ich habe schon mit NthField (s," ",i) experimentiert. Da aber ein einfacher Vergleich mit If s=Uppercase(s) nicht Casesensitive arbeitet musste ich schon zu Text wandeln und mit t.Compare(o.ToText,1) arbeiten.
Nun stelle ich fest, dass ich schon mit NthField ein Problem habe, wenn hinter dem Namen kein Leerzeichen sondern ein Komma, Punkt oder Zeilenende steht.

Bevor ich nun lange mit diversen Prfungen hantiere, frage ich doch mal in die Runde, ob nicht jemand einen sinnvolleren Ansatz kennt.

Gru, Stefan Mettenbrink.

RegEx

Hatte ich befürchtet. :frowning:
Ist nicht gerade etwas, mit dem ich mich gut auskenne. Mal schauen, ob ich heute Abend dazu komme. Wir müssen die Enkel hüten :slight_smile:

Old framework:
http://documentation.xojo.com/index.php/Titlecase

New framework:
http://developer.xojo.com/text$TitleCase
http://developer.xojo.com/string$Titlecase

Maybe you can use this to Titlecase the words.
(Mein Deutsch ist leider nicht so gut)

Converts all words to TitleCase. I only want UpperCase words to convert.

Any rules bout the ucase words? 2nd word always ucase … no ucase + numbers aso.?

eg: “ICH bin ein BERLINER, John FITZGERALD Kennedy, JUNE 1963”

Or is it random?

Wie gut mu das ein? Und wieviel Arbeit willst Du da reinstecken? Willst Du das nur fr das bliche Alphabet oder auch fr andere (russisch, chinesisch) etc.?

Das erste Problem ist: was ist ein Wort? Beim ersten Versuch knnte man es mit split(string, " ") versuchen. Dann knntest Du die Punktuation am Ende rausfischen. Und am Anfang, wenn Du spanischen Text hast. Danach wrde ich fr jedes Wort das Regex fr den TitleCase machen. Und zuletzt kannst Du dann mit der Punktuation den Text wieder zusammensetzen. Ich hoffe mal, da Du da keine GBs verarbeiten willst.

Ich denke, Pauls Vorschlag kombiniert mit Beatrix’ wäre eine Möglichkeit, wenn du RegEx umgehen willst:
Konvertiere den String in Text, mache ein Split" ", iteriere durch die Worte, wobei du ein Compare case sensitive mit dem Lowercased-Wort machst, und falls nicht gleich, konvertiere das Wort in Titlecase. Und dann wieder mittels Text.Join zusammensetzen. Durch die Locale hast du die Möglichkeit, jede Sprache korrekt zu behandeln.

EDIT: An Zeilenenden sollte natürlich auch gesplittet werden, also am besten ein weiter Split in der Schleife auf EOL-Unicode mit sofortigem Wieder-Zusammensetzen.

-> Thomas Rottensteiner

Random, no rules.

-> Beatrix Willius
Das ist nur ein Hilfsangebot für einen meiner Anwender. Er hat in Bemerkungstexten die Nachnamen in UpperCase geschrieben und möchte das nun ändern. Wird wohl nur A-Z und ÄÖÜ betreffen.

-> Ulrich Bogun

Das war auch mein Ansatz:
[i]bis=CountFields(s," “)
for i=1 to bis
n=NthField(s,” ",i)
t=n.ToText
o=Uppercase(n)
if t.Compare(o.ToText,1)=0 then
n=Titlecase(n)
end
r.Append n
next

Return Join(r," ")[/i]

Bis ich gemerkt habe, dass auch Komma, Punkt, ggf. Doppelpunkt, Semikolon und Minus, sowie Zeilenende berückischtigt werden müssen.

Ich habe heute Nachmittag mal 10 Minuten damit verbracht, die Worttrennung von RegEx zu nutzen (getestet mit “?\b??[A-ZäöüÄÖÜ]*\b” ind Textwrangler). Funktionierte erst mal nicht. Mag sein, dass es an Grep statt RegEx liegt. Ein Test in Xojo mit RegExMBS steht noch aus.
Kann jemand bestätigen, dass der SearchString für RegEx passt und nur Worte findet, die in Uppercase geschrieben sind?

Heute nicht mehr. Ich hoffe, dass ich Morgen etwas Zeit finde.

Gruß, Stefan Mettenbrink.

If you want good Regex help for your problem, you should ask @Kem Tekinay.
He’s a RegEx guru.

Ich habe es jetzt ohne RegEx umgesetzt (die Methode bekommt den zu prüfenden String und gibt die konvertierte Variante zurück):

dim j,bis as Integer
dim test,n,wort,rstring as String

bis=len(s)
test=“ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ”
for j=1 to bis
n=mid(s,j,1)
if InStrb(test,n)>0 then
Wort=wort+n
else
if len(wort)>1 then
Wort=Titlecase(Wort)
rstring=rstring+Wort+n
Wort=""
else
rstring=rstring+Wort+n
Wort=""
end
end
next
if len(wort)>1 then
Wort=Titlecase(Wort)
rstring=rstring+Wort
end

Return rstring

Einfach alle Buchstaben auf Großbuchstaben getestet und diese zusammengefügt, Alles was mehr als 2 Großbuchstaben hat, ist eine Wort, welches konvertiert wird.

Sieht für mich passabel aus. Zumindest für diesen einmaligen Fall.

Gruß, Stefan Mettenbrink.