AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[PREG] Wie Zahlen erkennen?

Ein Thema von Chewie · begonnen am 5. Jan 2004 · letzter Beitrag vom 14. Jan 2004
Antwort Antwort
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

[PREG] Wie Zahlen erkennen?

  Alt 5. Jan 2004, 00:11
Ich habe Strings folgender Art:
Zitat:
irgendeineabsolutbeliebigeZeichenkette_{0001-9999}.irgendeineabsolutbeliebigeZeichenkette
Mittels regulären Ausdrücken will ich nun herausfinden, ob mein String dieses Muster efüllt. Der Tiefstrich und der Punkt und natürlich der Dateiname und die Dateiendung (also die beliebigen Zeichenketten) sind ja kein Problem, aber die Zahl ist der Knackpunkt.
Hat jemand eine Idee/Weiß jemand, wie man das recht einfach prüfen könnte? Wenn es nur mit einem komplexen Ausdruck ginge, dann bin ich mit einer Copy-Funktion, die mir den String nach dem Tiefstrich und vor dem Punkt zurückgibt, besser beraten.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#2

Re: [PREG] Wie Zahlen erkennen?

  Alt 5. Jan 2004, 06:52
Also zumindestens in php lässt sich das mit folgendem Pattern lösen:

Code:
<?php

  $str = "irgendeineabsolutbeliebigeZeichenkette_{0001-9999}.irgendeineabsolutbeliebigeZeichenkette";

  if (preg_match('/.*_\{([0-9]{4})\-([0-9]{4})\}\..*/', $str, $match)) {

    echo $match[1] . " - " . $match[2];

  }

?>
Weiss nicht, ob es auch kürzer und eleganter geht - aber so scheint es schonmal zu tun.

Gruß

Wormid
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
marvin.maybe

Registriert seit: 12. Jan 2004
17 Beiträge
 
#3

Re: [PREG] Wie Zahlen erkennen?

  Alt 14. Jan 2004, 17:50
Hallo,

ich würde einen Mini-Scanner programmieren (Scanner - das Ding aus Compilerbau).
Vorteil: Einfach zu programmieren und superschnell.

Falls Du Infos dazu brauchst, melde Dich - ich kopiere Dir dann ein paar Zeilen Code.

(Reguläre Ausdrücke wären mir schon fast zu spezielle, wenn das Dein einziges Problem dieser Art wäre.)

Gruß, Marvin.
  Mit Zitat antworten Zitat
cYaONE

Registriert seit: 18. Mai 2003
Ort: Sand am Main
192 Beiträge
 
Delphi 7 Personal
 
#4

Re: [PREG] Wie Zahlen erkennen?

  Alt 14. Jan 2004, 18:02
Suchst du sowas hier?
  Mit Zitat antworten Zitat
choose

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

Re: [PREG] Wie Zahlen erkennen?

  Alt 14. Jan 2004, 18:05
Der Ausdruck von Wormid sollte funktionieren, sofern Du wirklich "irgendeineabsolutbeliebigeZeichenkette" meintest. Falls nicht, ersetze die Teile einfach durch ".*" bzw ".+", falls Du hier mindestens ein Zeichen haben möchtest.
Achtung, "." erkennt auch Leerzeichen, Tabulatoren, etc. Falls Du allerdings einen Bezeichner erwartest, sieh Dir einmal die Zeichenklasse "\w" genauer an.

Solltest Du mit "{0000-9999}" gemeint haben, dass hier zB "{0000}", "{0001}", etc. stehen sollte, musst Du das ebenfalls erwähnen.
Ich gehe letztlich von diesem Ausruck aus:
Code:
\w+_\{\d{4}\}.\w+
Suche im Forum, falls Du nicht genau weißt, wie Du Hier im Forum suchenreguläre Ausdrücke in Delphi verwenden kannst.
gruß, choose
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: [PREG] Wie Zahlen erkennen?

  Alt 14. Jan 2004, 18:57
Zunächst: "irgendeineabolsutbeliebigeZeichenkette" soll das heißen, was es bedeutet, nicht dass genau dieser String da steht .
Ich hab mich an einer Stelle etwas missverständlich ausgedrückt, die geschweiften Klammern sind nciht teil des Bezeichners, sondern dienten nur zur Abgrenzung.

Das
Code:
\d{4}
bedeutet wohl, dass da Zahlen mit 4 Stellen stehen dürfen, oder? Allerdings ist das doofe, dass 0001 erlaubt ist, 0000 aber nicht! Das war ja das grundlegende Problem! Ich bräuchte also eine Art Mindestwert, den ich angeben kann.

Die Frage ist zwar nicht mehr so wichtig, ich habe das Problem jetzt mit Stringformatierungen gelöst. Hinter dem Punkt steht kein Tiefstrich, und so kopiere ich die Zeichen vom letzten Tiefstrich bis zum letzten Punkt, das geht auch. Aber mich würde dennoch interessieren, ob es sowas gibt.

Zitat:
Suche im Forum, falls Du nicht genau weißt, wie Du REGULÄRE und AUSDRÜCKE in Delphi verwenden kannst.
Nicht nötig. Erstens habe ich bereits RegExp-Bibliotheken in Delphi benutzt, zweitens brauche ich den Pattern in PHP.

Aber danke für die Hilfe von allen!
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
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, 19: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz