Moin, in unserer Firma werden Kabel mit AWG-Querschnitten wie folgt bezeichnet: 22 = AWG 22 Einzelleitung 2C22 = 2-adrige Leitung AWG 22 verdrillt, ungeschirmt 3C22s = 3-adrige Leitung AWG 22 geschirmt 8 = AWG 8 Einzelleitung 4C20s = 4-adrig AWG 20 geschirmt RG142 = selbsterklärend Über den Sinn und Unsinn dieser Kurzbezeichnungen kann man streiten, aber so ist es und damit muss ich leben. Ich muss in einem Skript anhand der Querschnitte sortieren. Da es alphanumerisch natürlich nicht funktioniert, möchte ich gerne per Regex einen "Sortier-String" basteln. Den Sonderfall RG142 kann ich separat abfangen. Mir geht es darum, von rechts aus alphanumerische Zeichen zu ignorieren, dann aufeinanderfolgende Ziffern zurückzugeben und ab dem ersten alphanumerischen Zeichen wieder zu ignorieren. Sprich 3C22s liefert 22. Wer kann helfen?
1 | $ perl -ne '/(\d+)s?$/;print $1 . "\n"' <<EOF |
2 | > 22 |
3 | > 2C22 |
4 | > 3C22s |
5 | > 8 |
6 | > 4C20s |
7 | > EOF |
8 | 22 |
9 | 22 |
10 | 22 |
11 | 8 |
12 | 20 |
Danke! Das ist aber sed, oder? Ich muss das innerhalb eines PostgreSQL-Statements anwenden, mittels SUBSTRING(spalte, '...regex...'). Funktioniert mit euren Lösungen bei mir leider nicht (gibt einen leeren String zurück).
Um es deutlicher zu machen:
1 | SELECT |
2 | spalte1, |
3 | spalte2, |
4 | substring(spalte3, '...regex...') as orderstring |
5 | FROM |
6 | tabelle1, |
7 | tabelle2 |
8 | WHERE |
9 | ... |
10 | ORDER by orderstring |
Probier mal das:
1 | substring(spalte3 from '\d+\D*$') as orderstring |
Evlt. musst die die Backslashes verdoppeln, da kenne ich mich mit (Postgre)SQL zu wenig aus.
:
Bearbeitet durch Moderator
Regex-Nicht-Versteher schrieb: > alphanumerische Zeichen zu > ignorieren, dann aufeinanderfolgende Ziffern zurückzugeben https://de.wikipedia.org/wiki/Alphanumerische_Zeichen
Regex-Nicht-Versteher schrieb: > Ich muss das innerhalb eines PostgreSQL-Statements anwenden, Tja, sowas sollte man besser ins Eröffnungsposting schreiben ...
Wenn Du bereits eine Datenbank hast, warum dann nicht einfach eine kleine Tabelle mit den beiden Spalten 'Bezeichnung' und 'Querschnitt' anlegen, Daten eintragen, eine Join auf beide Tabellen machen und nach Querschnitt sortieren? Dürfte deutlich einfache zu Pflegen sein als jedes Skript.
Oh Mann, natürlich war "nicht-numerisches" Zeichen gemeint statt alphanumerisches Zeichen. Ich habe es jetzt dank eurer Hilfe hinbekommen. Eine Kombination der Lösungen von Jörg Wunsch und Yalu gefällt mir am besten:
1 | SELECT SUBSTRING('2C22s', '(\d+)\D*$'); |
2 | substring |
3 | ----------- |
4 | 22 |
5 | (1 row) |
> Wenn Du bereits eine Datenbank hast, warum dann nicht einfach ...
Ich habe nur Lesezugriff auf die Datenbank.
Regex-Nicht-Versteher schrieb: > SELECT SUBSTRING('2C22s', '(\d+)\D*$'); Ja, die Klammern habe ich vergessen. Die müssen natürlich mit dazu, damit auch wirklich nur die Ziffern und nicht auch noch die nachfolgenden Buchstaben ausgegeben werden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.