grassi3000
radeon gefrierer
|
Tja, wie mach ich das am einfachsten? Beispiel: ich hab den String "Schüler 3A"
Ich weiß, dass genau eine einstellige Int Zahl drinnen ist, allerdings nicht deren Position innerhalb des Stringes, und auch nicht ihren Wert.
Bearbeitet von grassi3000 am 17.08.2004, 15:38
|
dio
Here to stay
|
regular expressions. da ich mit c# nix am hut hab, musst dich selbst um die funktionen kümmern  .
|
grassi3000
radeon gefrierer
|
ah, daran hab ich nicht gedacht. thx für den tip!
|
grassi3000
radeon gefrierer
|
ok, leider hat mich der Tip nur teilweise weitergebracht, da ich nur gefunden habe, wie ich durch escape sequenzen entweder nach whitespace oder nach "word boundary" sequenzen suchen kann. word boundary beinhalten allerdings sowohl zahlen als auch buchstaben.
mir würde schon reichen, wie ich einfach die position des integer - werts im String bekomme.
|
sliver33
Big d00d
|
Mein Gebiet ist zwar eher JAVA aber wie ich immer sag C# is eh des gleiche nur halt von M$.
In Java würd ichs so machen: String.split(" "); Dann bekommst du ein Array mit {Schüler,3A} und dann nimmst du mit substr(0,1) den ersten Buchstaben (in diesem Fall Zahl) vom zweiten Element;
Source: String schStr = "Schüler 3A"; Array a = schStr.split(" "); String number = a[1].substring(0,1);
Du musst dir jetzt nur noch die C# Funktionen dazu suchen.
|
grassi3000
radeon gefrierer
|
thx, werds gleich ausprobieren.
|
rettich
Legendwaffle, waffle!
|
String.split(" "); Dann bekommst du ein Array mit {Schüler,3A} aber nur, wenn das beispiel IMMER so aussieht wie oben. anderer ansatz: den string exploden, sodass jeder character in einem eigenen feld eines arrays steht. dann die felder der reihe nach durchgehen und schauen, von welchem zeichen der char-wert im bereich der integer-zahlen liegt (laut ascii tabelle). oder du machst dir eine vb-like isnumeric funktion, die dir sagt, ob das ganze ein numeric-wert ist oder nicht: public bool IsNumeric(string s)
{
try {
Int32.Parse(s);
}
catch {
return false;
}
return true;
}
|
gue
Addicted
|
Ich hab auch noch nie C# programmiert aber mit regulären Ausdrücken müssts so ähnlich gehen: public String GetFirstNumber(String str) {
RegEx r = new RegEx("([0-9])");
Match m = r.Match(str);
return m.Result("$1");
}
|
rettich
Legendwaffle, waffle!
|
|
gue
Addicted
|
@rettich: Also nix für ungut aber reguläre Ausdrücke sind - in jeder Sprache - ungefähr 100 mal schneller, als einen String in ein String-Array aufzusplitten und dann für jeden Teil mit einer Funktion, in der ein Try-Catch-Block ist (!!) die Werte zu überprüfen. Außerdem lässt sich die Funktionalität mit regulären Ausdrücken besser erweitern, wenn die Zahlen z.B. zweistellig benötigt werden.
|
dio
Here to stay
|
@grassi: wieso sollt des mit regexp ned gehn 
|
mat
AdministratorLegends never die
|
nein.. rettich hat recht!  regex sind meistens langsamer als andere lösungen.. brauchen ja auch eine finite statemachine, dafür sind regex auch erweiterbarer.
|
that
Hoffnungsloser Optimist
|
Regex haben dafür ein hohes Optimierungspotenzial, wenn man gleiche Ausdrücke oft benutzt - man kann die Statemachine ja zur Laufzeit in ausführbaren Code compilieren.
|
mat
AdministratorLegends never die
|
ich weiss that  ich wollte nur diesen satz ungefähr 100 mal schneller, als einen String in ein String-Array aufzusplitten und dann für jeden Teil mit einer Funktion, in der ein Try-Catch-Block ist (!!) die Werte zu überprüfen kritisieren.
|
rettich
Legendwaffle, waffle!
|
zugegeben, das mit dem try-catch block ist sicher nicht die sauberste und schnellste lösung - vor allem, wenn man es für jedes element des arrays durchführt (die die schüler alle "alexander christian kraushuber-birnbauer 3A" heißen  ) und die aussage mit dem "erweiterbar" stimmt auch. ideal wäre überhaupt, die parameter in einem ini-file von außen wartbar usw leider sind die regex, wie mat schon gesagt hat, in c# (und nicht nur dort) etwas lahm. für diese, sicher nicht zeitkritische anwendung sind sie aber sicher brauchbar. deswegen oben auch mein link.
|