MySQL Verwendung regulärer Ausdrücke

baserider

Well-known member
ID: 174417
L
10 März 2007
682
23
Hi,

in meiner Tabelle stehen im Beschreibungstext Größenangaben in der Art 3x3m, 120x90cm oder 150x150cm

Nun will ich alle quadratischen Größen herausbekommen, also wo zwischen dem x links und rechts die gleiche Zahl steht. Ist das mit MySQL möglich oder hat jemand ne andere Idee?
 
Am schnellsten auf der Kommandozeile (bash)

Testdaten (Dateiname: data)
3x3m
120x90cm
150x150cm
150x180cm
54x54km
32x32mm
64x13m
97x98cm

grep \\\([0-9]\\\+\\\)x\\\1[mck]\\\?m data


Ergebnis
3x3m
150x150cm
54x54km
32x32mm
 
der reguläre ausdruck würde so aussehen:

Code:
(^|[^0-9])[0-9]+x\1($|[^0-9])

allerdings kann mysql afaik keine backreferences
(zumindest nicht von haus aus, gibts wohl extensions, die das können, zb https://www.mysqludf.org/lib_mysqludf_preg/)

daher lässt sich das leider nicht einfach mit einem einzelnen query lösen.

je nach anwendung und datenmenge würde ichs in PHP oder als shellscript umsetzen
 
Hi,

danke für die Antworten. Backreferences war das Stichwort :)

Dann werde ich mir die Daten mittels Script einlesen und per PHP weiter arbeiten.
 
nochmal eine Frage:

bei mir funktioniert der ausdruck so:

Code:
$pattern = '([0-9]+)x\1';

Kann man auch noch abfangen, das beide Zahlen die gleiche Anzahl an Ziffern haben müssen? Es wird auch gefunden "34x340" , da ja die 34 enthalten ist
 
für was stehen denn die 3 slashes jeweils hintereinander?

Die Anzahl hängt davon ab wie das Argument "unten" (also beim aufgerufenen Programm, hier: grep) ankommen muß und was "oben" (hier: seitens der aufrufenden Shell) evtl schon eine Sonderbehandlung durchläuft. Damit beispielsweise bei grep die Folge "\(" ankommt muß jeweils ein Backslash vorangestellt werden.


Kann man auch noch abfangen, das beide Zahlen die gleiche Anzahl an Ziffern haben müssen? Es wird auch gefunden "34x340" , da ja die 34 enthalten ist

Jein. Es wird ja nur auf Gleichheit der Ziffernfolgen geprüft, deren Länge ist irrelevant. Hier wird die zweite Folge durch die Angabe einer Einheit (dargestellt durch "[mck]\\\?m" -> Milli-, Zenti-, Kilo- oder eben nur Meter) begrenzt.

Ohne Einheit würde die zweite Folge durch das Zeilenende begrenzt, der entsprechende Teilausdruck kann aber angepaßt werden (noch mehr "\" :ugly: )

Testdaten (Dateiname: data)
34x34m
34x345km
34x34
345x3456
3456x345
345x3456cm


Ziffernfolge
grep \\\([0-9]\\\+\\\)x\\\1 data
34x34m
34x345km
34x34
345x3456
345x3456cm


Ziffernfolge, Einheit erforderlich
grep \\\([0-9]\\\+\\\)x\\\1[mck]\\\?m data
34x34m


Ziffernfolge, Einheit möglich
grep \\\([0-9]\\\+\\\)x\\\1\\\(\$\\\|[mck]\\\?m\\\) data
34x34m
34x34


edit: wenn führender/folgender Text keine Rolle spielt oder nicht vorkommt reicht schon "\([0-9]\+\)x\1[^0-9]" als Suchmuster:

grep \\\([0-9]\\\+\\\)x\\\1[^0-9] data
 
Zuletzt bearbeitet:
nochmal eine Frage:

bei mir funktioniert der ausdruck so:

Code:
$pattern = '([0-9]+)x\1';

Kann man auch noch abfangen, das beide Zahlen die gleiche Anzahl an Ziffern haben müssen? Es wird auch gefunden "34x340" , da ja die 34 enthalten ist

mit dem von mir geposteten pattern sollte das funktionieren