Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#7

Re: [PREG] Wie Zahlen erkennen?

  Alt 14. Jan 2004, 20:28
Zitat von Chewie:
Zunächst: "irgendeineabolsutbeliebigeZeichenkette" soll das heißen, was es bedeutet, nicht dass genau dieser String da steht .
Aha. Weil Du nicht weiter darauf eingengangen bist, gehe ich davon aus, dass wirkliches jedes Zeichen, also auch Tabs, etc. zulässig sind.

Zitat von Chewie:
[..]die geschweiften Klammern sind nciht teil des Bezeichners, sondern dienten nur zur Abgrenzung.
Eine weitere Vereinfachung

Zitat von Chewie:
Das "\d{4}" bedeutet wohl, dass da Zahlen mit 4 Stellen stehen dürfen, oder?
Nicht ganz. Reguläre Ausdrücke kennen keine komplexe Strukturen wie Zahlen oä sondern arbeiten auf Zeichenebene. Soll nach einem "d" gesucht werden, lautet der Ausdruck "d". Soll entweder nach einem "d" oder einem "e" gesucht werden, kann man neben einer Fallunterscheidung "d|e" auch sogenannte Zeichenklassen verwenden (hier: "[de]"). Diese Klassen eigenen sich besonders zur Beschreibung von Zeichenbereichen. So lassen sich alle gültigen Zeichen einer Zahlenziffer mit "[0-9]" beschreiben bzw in der Kurzform dieses Spezialfalls: "\d".

Zitat von Chewie:
Allerdings ist das doofe, dass 0001 erlaubt ist, 0000 aber nicht!
Kein Problem mit einer Fallunterscheidung:
Code:
\d{3}[1-9]|\d\d[1-9]\d|\d[1-9]\d\d|[1-9]\d{3}
bzw, falls Dir egal ist, ob es tatsächlich genau vier Ziffern sind:
Code:
\d*[1-9]\d*
Zitat von Chewie:
Hinter dem Punkt steht kein Tiefstrich, und so kopiere ich die Zeichen vom letzten Tiefstrich bis zum letzten Punkt, das geht auch.
Aus dieser Aussage schließe ich, dass Du von maximal einem Vorkommen des Musters innerhalb des Strings ausgehst und Du tatsächlich nicht wissen möchtest, ob das Muster vorkommen, sondern Du wissen möchtest, wie die enthaltene Zahl aussieht. Weil Du ferner die Teile vor dem Underscore bzw nach dem Punkt verwirst, reduziert Du das Existenzkriterium auf die Existenz von gültigen Ziffern innerhalb dieser Begrenzer. Auch die uns vorgegebene Länge vier der Zahl scheint damit irrelevant zu sein.

Kombiniere ich diese Prämissen und gehe ich von der Verwendung meines RegExp-Wrappers mit automatischer Referenzzählung aus, könnte der Code so aussehen:
Delphi-Quellcode:
with RegExp('_(\d*[1-9]\d*)\.') do
  if Execute(AString) then
    myInt:= StrToInt(Match[1]);
gruß, choose
  Mit Zitat antworten Zitat