C#: Int aus String extrahieren

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/c_int_aus_string_extrahieren_122102/page_1 - zur Vollversion wechseln!


grassi3000 schrieb am 16.08.2004 um 18:09

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.


dio schrieb am 16.08.2004 um 18:45

regular expressions. da ich mit c# nix am hut hab, musst dich selbst um die funktionen kümmern ;).


grassi3000 schrieb am 16.08.2004 um 18:52

ah, daran hab ich nicht gedacht.
thx für den tip!


grassi3000 schrieb am 17.08.2004 um 15:41

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 schrieb am 17.08.2004 um 15:49

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 schrieb am 17.08.2004 um 15:51

thx, werds gleich ausprobieren.


rettich schrieb am 17.08.2004 um 16:03

Zitat von sliver33
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:

Code:
public bool IsNumeric(string s)
{
      try {
          Int32.Parse(s);
      }
      catch {
          return false;
      }
    return true;
} 


gue schrieb am 17.08.2004 um 16:07

Ich hab auch noch nie C# programmiert aber mit regulären Ausdrücken müssts so ähnlich gehen:

Code:
public String GetFirstNumber(String str) {
  RegEx r = new RegEx("([0-9])");
  Match m = r.Match(str);
  return m.Result("$1");
}


rettich schrieb am 17.08.2004 um 16:12

regex sind in c# (wie alle string-operationen) schweinelangsam.

aber solangs keine performance issues gibt: http://windows.oreilly.com/news/csharp_0101.html


gue schrieb am 17.08.2004 um 16:22

@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 schrieb am 17.08.2004 um 17:07

@grassi: wieso sollt des mit regexp ned gehn :confused:


mat schrieb am 17.08.2004 um 23:48

nein.. rettich hat recht! :D

regex sind meistens langsamer als andere lösungen.. brauchen ja auch eine finite statemachine, dafür sind regex auch erweiterbarer.


that schrieb am 18.08.2004 um 01:39

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 schrieb am 18.08.2004 um 01:45

ich weiss that :)

ich wollte nur diesen satz

Zitat
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 schrieb am 18.08.2004 um 07:41

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 :D)

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.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025