Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Regex: Frage zur abfrage (https://www.delphipraxis.net/146114-regex-frage-zur-abfrage.html)

Chefx 13. Jan 2010 19:30


Regex: Frage zur abfrage
 
Hallo DPs, :hi:

Ich hab eine frage wie ich das realisieren kann.
Also erst mal meine momentane abfrage:
Code:
(^|\b)(?<text>[a-zA-ZäöüÄÖÜß]*)(\b|$)
Mein text:
Zitat:

Der text2 hat kein sinn. er kostet 2222222 €
wenn ich das jetzt suche kommt das raus:
Zitat:

Der|0,hat|10,kein|14,sinn|19,er|25,kostet|28,
So mein Problem ist jetzt er soll "text2" auch mit finden aber halt nicht 2222222.
also meine gedachte regel:
mindestens ein buchstaben in dem Wort, ist dann halt erlaubt.

aber wie sage ich den das ?
hier das hab ich probiert aber es funktioniert nicht wirklich:
Code:
(^|\b)(?([a-zA-ZäöüÄÖÜß]{1,}[0-9])<text>[a-zA-ZäöüÄÖÜß0-9]*)(\b|$)
der fehler ist: (?( aber das ist doch die anweisung für If then oder?

Diese http://www.regular-expressions.info/delphi.html Komponente nutze ich.

Ich hoffe ihr habt eine Geniale lösung (es würde mich wundern wenn nicht :-D )

MfG

Chefx :mrgreen:

Khabarakh 13. Jan 2010 20:27

Re: Regex: Frage zur abfrage
 
Zitat:

Zitat von Chefx
der fehler ist: (?( aber das ist doch die anweisung für If then oder?

Wenn man bei Regexes an "if then" denkt, kann sich doch nur ein Knoten im Hirn bilden, oder :D ? Dieses (?<a>b) ist jedenfalls eine benannte Gruppe, die du durch deine Einfügung zerlegt hast. Du suchst wohl eher a+ = "Einmal a oder öfter".
Code:
(?<text>[a-zA-ZäöüÄÖÜß]+\d*)

Basilikum 14. Jan 2010 07:32

Re: Regex: Frage zur abfrage
 
da würde sich sowas anbieten:
Code:
(^|\b)(?<text>[a-zA-ZäöüÄÖÜß][a-zA-ZäöüÄÖÜß0-9]*)(\b|$)

MarioM. 14. Jan 2010 08:55

Re: Regex: Frage zur abfrage
 
Voraussetzung:
Zitat:

Zitat von Chefx
also meine gedachte regel:
mindestens ein buchstaben in dem Wort, ist dann halt erlaubt.

Wobei es wohl eher lauten sollte 'Eine Zahl im Wort ist erlaubt'.

Zitat:

Zitat von Khabarakh
Code:
(?<text>[a-zA-ZäöüÄÖÜß]+\d*)

Ignoriert numerische Zeichen am Anfang eines Wortes
Splittet einen Match bei numerischen Zeichen innerhalb eines Wortes

Zitat:

Zitat von Basilikum
Code:
(^|\b)(?<text>[a-zA-ZäöüÄÖÜß][a-zA-ZäöüÄÖÜß0-9]*)(\b|$)

Ignoriert Wörter, die mit numerischen Zeichen beginnen.


Da Deine Komponente Posix-Zeichenklassen beherrscht, probiere es mal so: (ich gehe davon aus, dass Du mehrere numerische Zeichen in einem Wort zulassen willst, und nur Wörter ausschließen willst, die ausschließlich aus numerischen Zeichen bestehen):
Code:
\b[[:alnum:]]*[[:alpha:]]+[[:alnum:]]*\b

Chefx 15. Jan 2010 23:46

Re: Regex: Frage zur abfrage
 
ok das funktioniert aber ich hab probleme mit den ÄÖÜß, weil alnum das ja nicht mit drin hat.
Code:
\b[[:alnum:]äöüÄÖÜß]*[[:alpha:]äöüÄÖÜß]+[[:alnum:]äöüÄÖÜß]*\b
aber der macht die jetzt einzeln, bsp:
Zitat:

das ist ein Text über Reguläre Ausdrücke
also
Zitat:

das , ist , ein , Text , ü , ber , Regul , ä , re , Ausdr , ü , cke
wo liegt das problem? :gruebel:

himitsu 16. Jan 2010 00:04

Re: Regex: Frage zur abfrage
 
vielleicht so?

\b[:alnum:äöüÄÖÜß]*[:alpha:äöüÄÖÜß]+[:alnum:äöüÄÖÜß]*\b

Chefx 16. Jan 2010 12:08

Re: Regex: Frage zur abfrage
 
ne das funktioniert leider nicht.:gruebel:

Chefx 17. Jan 2010 20:33

Re: Regex: Frage zur abfrage
 
hab schon andere varianten probiert aber sorichtig funktioniert das nicht :cry:
Code:
\b[a-Za-z0-9äöüÄÖÜß]*[a-Za-zäöüÄÖÜß]+[a-Za-z0-9äöüÄÖÜß]*\b
geht auch nicht (kommt ein fehler von der Regexkomponente)

Khabarakh 17. Jan 2010 21:09

Re: Regex: Frage zur abfrage
 
Uff, da das ja wirklich die Minimal-Version ist: Sagt der Fehler irgendetwas Genaueres?

Edit: Du meinst wohl eher "[A-Z..."?

Chefx 17. Jan 2010 21:21

Re: Regex: Frage zur abfrage
 
ohja stimmt, :lol:
aber der trennt immer noch das äöü vom wort ab (wie oben) aber warum denn? :gruebel:

MarioM. 18. Jan 2010 08:07

Re: Regex: Frage zur abfrage
 
Lass mal die Wortgrenzen weg; damit scheint die Komponente, respektive die PCRE-Lib, Probleme zu haben.

Ich habe mal eine Support-Anfrage gestellt.

Chefx 18. Jan 2010 15:57

Re: Regex: Frage zur abfrage
 
Zitat:

Zitat von MarioM.
Lass mal die Wortgrenzen

Was meinst du damit?

MarioM. 18. Jan 2010 16:19

Re: Regex: Frage zur abfrage
 
Code:
\b

Chefx 18. Jan 2010 16:40

Re: Regex: Frage zur abfrage
 
könnte ich mir da auch eine \b selbst erstellen, weil der sucht ja alles zusammen was den im weg kommt :stupid:

MarioM. 18. Jan 2010 16:50

Re: Regex: Frage zur abfrage
 
Zitat:

Zitat von Chefx
könnte ich mir da auch eine \b selbst erstellen, weil der sucht ja alles zusammen was den im weg kommt :stupid:

Hä?

Chefx 18. Jan 2010 16:58

Re: Regex: Frage zur abfrage
 
sorry vielleicht dumm ausgedrückt :-D
Er soll ja nacht Wörtern suchen und da brauch ich ja eine Beschränkung (also leerzeichen bis leerzeichen usw.).

also der Beispieltext:

Zitat:

das ist ein Text über Reguläre Ausdrücke
und die Suchergebnisse:
Zitat:

0: d... 13: l 14: ä 15: c 16: k
(es wurden doppelte Buchstaben weggelassen ;-) )

Code:
(\f|\n|\r|\t|\v) [A-Za-z0-9äöüÄÖÜß]*[A-Za-zäöüÄÖÜß]+[A-Za-z0-9äöüÄÖÜß]*(\f|\n|\r|\t|\v)
ich hab das so probiert aber da findet der nix

Chefx 19. Jan 2010 06:32

Re: Regex: Frage zur abfrage
 
sorry das ich pushen muss, :roll:
aber ich brauch das jetzt richtig dringend. Ich weiß das ihr keine Roboter seit aber vielleicht hat ja noch einer eine Idee (Bitte nicht hauen) :-D

Ich hab auch diese Variante probiert aber das hat auch nicht geklappt:
Code:
[^A-Za-z0-9äöüÄÖÜß]+ [A-Za-z0-9äöüÄÖÜß]*[A-Za-zäöüÄÖÜß]+[A-Za-z0-9äöüÄÖÜß]*[^A-Za-z0-9äöüÄÖÜß]+

MarioM. 19. Jan 2010 07:16

Re: Regex: Frage zur abfrage
 
Also das Problem ist, dass \b auch Umlaute als Wortgrenzen interpretiert. Es gilt nun also, Dir mittels bspw. Lookarounds selber Wortgrenzen zu 'bauen', die das nicht tun.

Khabarakh 19. Jan 2010 10:01

Re: Regex: Frage zur abfrage
 
Zitat:

Zitat von Chefx
und da brauch ich ja eine Beschränkung (also leerzeichen bis leerzeichen usw.).

Eigentlich nicht, denn ein Regex ist greedy.
Delphi-Quellcode:
[A-Za-z0-9äöüÄÖÜß]*[A-Za-zäöüÄÖÜß]+[A-Za-z0-9äöüÄÖÜß]*
sollte also funktionieren, siehe z.B. http://www.gskinner.com/RegExr/

MarioM. 19. Jan 2010 10:10

Re: Regex: Frage zur abfrage
 
Also bei mir funktioniert das Ganze auch ohne Wortgrenzen; logisch, da \p{N} und \p{L} (Unicode wg. Umlauten) keine Whitespaces berücksichtigen. Somit ist bei einem gefundenen Whitespace (auch Ende eines Wortes) Sense. Und da sie, wie Khabarakh richtigt sagt, von Natur aus gierig sind, findet die Engine alle Vorkommen in Deinem Text.

Code:
[\p{N}_]*[\p{L}_]+[\p{N}_]*
liefert mir für folgenden Text
Zitat:

1dasö ist einü Teöxt2 12345 1über ü2323 1Reguläre Ausdrücke
mit der PCRE-Engine folgende Ergebnisse:
Zitat:

1dasö
ist
einü
Teöxt2
1über
ü2323
1Reguläre
Ausdrücke
Vielleicht sollte man den Unterstrich auch noch berücksichtigen.

Edit: zu spät.

Chefx 19. Jan 2010 20:04

Re: Regex: Frage zur abfrage
 
ich glaub es liegt entweder an der Komponente oder mein Code hat einen hacken :gruebel:
(hab noch ein paar tage zeit bekommen :-D )
Delphi-Quellcode:
var
  code: array of string;
  regexMachine: TPerlRegEx;
begin
  SetLength(code, 0); //Array initialisieren
  SetLength(pos, 0);  //
  regexMachine := TPerlRegEx.Create(nil);
  try
    regexMachine.RegEx := '[A-Za-z0-9äöüÄÖÜß]*[A-Za-zäöüÄÖÜß]+[A-Za-z0-9äöüÄÖÜß]*'; // mit dem [\p{N}_]*[\p{L}_]+[\p{N}_]* hab ich es auch versucht hat auch nicht funktioniert
    regexMachine.Subject := 'hallo was machst du';
    regexMachine.Options := regexMachine.Options + [preUnGreedy];

    if regexMachine.Match then
    begin
      repeat
        setlength(code, Length(code) + 1);// Treffer um neu gefundenen erweitern
        code[Length(code) - 1] := regexMachine.MatchedExpression;// Neue Treffer in das code Array eintragen
      until not regexMachine.MatchAgain; // und weitersuchen. Abbruch, wenn kein Treffer mehr
    end;
    memo1.Lines.add(code[0]);
  finally
    regexMachine.free;
  end;
vielleicht ist hier der Fehler?

MarioM. 19. Jan 2010 20:54

Re: Regex: Frage zur abfrage
 
Kann den Code hier nicht testen, da ich die Komponente hier nicht installiert habe.
Oben wurde gesagt, dass alle Wörter matchen, da die RegEx gierig ist, und somit alles frisst, was sie finden kann.

In diesem Zusammenhang sieht mir folgendes etwas merkwürdig aus:
Delphi-Quellcode:
regexMachine.Options := regexMachine.Options + [preUnGreedy];
Desweiteren meine ich, mich erinnern zu können, dass die Matches mit
Delphi-Quellcode:
regexMachine.SubExpressions[...]
abgefragt werden.

Chefx 19. Jan 2010 21:06

Re: Regex: Frage zur abfrage
 
[quote="MarioM."]
In diesem Zusammenhang sieht mir folgendes etwas merkwürdig aus:
Delphi-Quellcode:
regexMachine.Options := regexMachine.Options + [preUnGreedy];
Was soll ich deiner Meinung nach machen?
Wenn du das meinst:
Delphi-Quellcode:
regexMachine.Options :=[preUnGreedy];
verändert es sich auch leider nicht.

Das mit regexMachine.SubExpressions[...] hatte ich auch schon.

Was nimmst du für eine Kompo?

Khabarakh 19. Jan 2010 22:13

Re: Regex: Frage zur abfrage
 
Zitat:

Zitat von Chefx
Was soll ich deiner Meinung nach machen?

Ganz weglassen? Oder war irgendetwas an unseren Beiträgen, dass es mit einem greedy Regex funktioniert, nicht verständlich :wall: ?

MarioM. 20. Jan 2010 06:57

Re: Regex: Frage zur abfrage
 
Zitat:

Zitat von Chefx
Was soll ich deiner Meinung nach machen?

Wenn Du häufiger mit Regulären Ausdrücken arbeitest, solltest Du Dir geeignete Literatur anschaffen.

Desweiteren kann es nicht schaden, wenn Du Dir ein kleines Tool zulegst, mit dem Du Deine RegEx testen und debuggen kannst. Da Du die PerlRegEx-Komponente einsetzt, liegt es nahe, Dein Taschengeld in den RegExBuddy zu investieren. Der ist vom gleichen Autor wie die von Dir genutzte Komponente, und Du kannst damit verschiedene Engines testen. Schau Dir das Ganze auf der Homepage einfach mal an.

Chefx 20. Jan 2010 16:03

Re: Regex: Frage zur abfrage
 
Zitat:

Zitat von Khabarakh
Oder war irgendetwas an unseren Beiträgen, dass es mit einem greedy Regex funktioniert, nicht verständlich :wall: ?

Sorry, ich war noch nicht so bewandert in diesen Thema (ich wusste nicht was du unter greedy meinst).

Ich werde mir die Links mal anschauen (ein Buch darüber ist bestimmt nicht verkehrt :mrgreen: ).

Danke für eure ganzen Antworten :thumb: :thumb:

MfG
Chefx

s-off 20. Jan 2010 18:59

Re: Regex: Frage zur abfrage
 
Hallo,

Zitat:

Zitat von Chefx
ein Buch darüber ist bestimmt nicht verkehrt

Ein Buch? Das ist nicht ein Buch - es ist das Buch - die Bibel der Regulären Ausdrücke :zwinker:
Nee, mal im Ernst; 'Der Friedl' - oder auch das 'Eulenbuch' genannt, ist das Standardwerk, wenn es um RegEx geht.
Und man lernt beim Lesen nicht nur etwas über die Regulären Ausdrücke, sondern auch noch ein bissel Perl, was dem ein oder anderen vielleicht Lust auf mehr macht.

Begleitend dazu würde ich noch diese kleine Referenz empfehlen, die man gut auf dem Schreibtisch liegen haben kann.
Und natürlich das Tool, das Mario oben schon empfohlen hat. Die Programme von JG-Soft sind, was Reguläre Ausdrücke betrifft, wirklich genial - besonders auch PowerGREP, was auf den ersten Blick recht teuer erscheint, aber für mich bisher jeden Cent wert war!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz