Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Regex: Teil des Datenamens erfassen (https://www.delphipraxis.net/211288-regex-teil-des-datenamens-erfassen.html)

MyRealName 26. Aug 2022 11:14

Regex: Teil des Datenamens erfassen
 
Hallo, ich verzweifel gerade an einem Regex (nichts neues, ich bin k..cke mit RegEx)...

Ich habe einen Dateinamen in folgendem Format : POST_123456789_12345678_XX123456/01-2022-123456789-654321-Lieferschein.tif
Davon möchte ich den Teil vor dem Lieferschein (fett markiert) herauslesen. Vorhergehende Nummern müssen nicht immer die gleiche Länge haben, aber die Anzahl der Blöcke und die Trennzeichen (_-/) sind immer da.

Ideen ?

BerndS 26. Aug 2022 11:21

AW: Regex: Teil des Datenamens erfassen
 
Mit geht es mit RegEx ähnlich. In diesem Fall würde ich ein String.Split verwenden.
Delphi-Quellcode:
var
  SA: TArray<string> ;
  Nr: string;
begin
  ...
  SA := AFileName.Split(['_','-']);
  if Length(SA) = 9 then
  begin
    Nr := SA[7];
   ...
  end;  
  ...
end;
Die RegEx Profis haben da möglicherweise eine besseren Vorschlag.

MyRealName 26. Aug 2022 11:32

AW: Regex: Teil des Datenamens erfassen
 
Das ist leider zu spezifisch, ich wollte eine Steuertabelle machen, wo ich unter anderem sagen kann, dass das Feld <Feldname>=Dateiname(<RegEx>) so zu finden ist. Jeder Eintrag der mit -_/ getrennt ist, ist ein Wert, den man lesen kann. Im Moment brauche ich nur einen. Damit es immer gleich ist von der Herangehensweise, würde ich das gerne mit RegEx lösen wollen.
Aber danke!

jaenicke 26. Aug 2022 11:40

AW: Regex: Teil des Datenamens erfassen
 
Ich weiß nicht, ob es einfacher geht, aber eine Möglichkeit wäre so (sprich 5 Gruppen mit Zahlen, X und / gefolgt von - oder _ und dann die Zahl, die dich interessiert):
Code:
POST_([0-9X\/]*[\-\_]){5}([0-9]*)\-Lieferschein\.tif
Was davon noch variabler sein muss, müsstest du schauen.

Ich weiß nicht, ob du das kennst, aber es gibt auch Testseiten wie diese:
https://regex101.com/

Monday 26. Aug 2022 12:06

AW: Regex: Teil des Datenamens erfassen
 
So?!
Code:
-([0-9]{6})-Lieferschein.tif$

So hat man gleich alle Gruppen (7 Gesamt):

Code:
POST_([0-9]{9})_([0-9]{8})_(XX[0-9]{6})\/([0-9]{2})-([0-9]{4})-([0-9]{9})-([0-9]{6})-Lieferschein.tif$

MyRealName 26. Aug 2022 12:37

AW: Regex: Teil des Datenamens erfassen
 
Zitat:

Zitat von jaenicke (Beitrag 1510769)
Ich weiß nicht, ob es einfacher geht, aber eine Möglichkeit wäre so (sprich 5 Gruppen mit Zahlen, X und / gefolgt von - oder _ und dann die Zahl, die dich interessiert):
Code:
POST_([0-9X\/]*[\-\_]){5}([0-9]*)\-Lieferschein\.tif
Was davon noch variabler sein muss, müsstest du schauen.

Ich weiß nicht, ob du das kennst, aber es gibt auch Testseiten wie diese:
https://regex101.com/

wenn man das X gegegn A-Z tauscht, geht es (mit XX meinte ich, dass da Buchstaben stehen), den Originaldateinamen kann ich ja wegen Datenschutz nicht zeigen :?
das sieht dann so aus:

Code:
POST_([0-9A-Z\/]*[\-\_]){5}([0-9]*)\-(?i)Lieferschein\.(?i)tif
Zusätzlich habe ich Lieferschein und tif noch case-insensitive gemacht.

Zitat:

Zitat von Monday (Beitrag 1510771)
So?!
Code:
-([0-9]{6})-Lieferschein.tif$

So hat man gleich alle Gruppen (7 Gesamt):

Code:
POST_([0-9]{9})_([0-9]{8})_(XX[0-9]{6})\/([0-9]{2})-([0-9]{4})-([0-9]{9})-([0-9]{6})-Lieferschein.tif$

Das scheint mir zu statisch, weil Die Längen der Zeichenketten immer fix angegeben sein müssen. Das kann ich aber nicht beinflussen, das kommt von Extern und wenn deren Rechnungsnummer zum Bsp. ein Teil der Zeichenkette ist und die von 3- auf 4-stellig wechselt, dann passt es schon nicht mehr.

shebang 26. Aug 2022 16:19

AW: Regex: Teil des Datenamens erfassen
 
Code:
(?:[0-9A-Za-z]+)
gibt dir jeweils ein Match für alle von Sonderzeichen separierten Teile deines Dateinamens, siehe https://regex101.com/r/SXpUsR/1

himitsu 26. Aug 2022 18:08

AW: Regex: Teil des Datenamens erfassen
 
Warum so kompliziert?

Delphi-Quellcode:
[0-9A-Za-z]+

bzw. wenn case-insensitive
Delphi-Quellcode:
[0-9A-Z]+


und falls z.B. - oder / mit zum "Text" gehören, dann die auch noch mit rein, z.B.
Delphi-Quellcode:
[0-9a-z-]+
(Modifier i nicht vergessen, oder A-Z wieder rein)
Delphi-Quellcode:
[0-9-]+|[0-9a-z]+
ähhhh
Delphi-Quellcode:
(?!-)[0-9-]+(?<!-)|[0-9a-z]+

MyRealName 27. Aug 2022 18:34

AW: Regex: Teil des Datenamens erfassen
 
ah cool, das verstehe ich sogar :O
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 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