Forum: PC-Programmierung Brauche Hilfe bei Regex


von Regex-Nicht-Versteher (Gast)


Lesenswert?

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?

von ./. (Gast)


Lesenswert?

s/[0-9]*c//;s/\([^0-9]*\).*/\1/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Regex-Nicht-Versteher (Gast)


Lesenswert?

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).

von Regex-Nicht-Versteher (Gast)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von Info (Gast)


Lesenswert?

Regex-Nicht-Versteher schrieb:
> alphanumerische Zeichen zu
> ignorieren, dann aufeinanderfolgende Ziffern zurückzugeben

https://de.wikipedia.org/wiki/Alphanumerische_Zeichen

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Regex-Nicht-Versteher schrieb:
> Ich muss das innerhalb eines PostgreSQL-Statements anwenden,

Tja, sowas sollte man besser ins Eröffnungsposting schreiben ...

von ah8 (Gast)


Lesenswert?

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.

von Regex-Nicht-Versteher (Gast)


Lesenswert?

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)

von Regex-Nicht-Versteher (Gast)


Lesenswert?

> Wenn Du bereits eine Datenbank hast, warum dann nicht einfach ...

Ich habe nur Lesezugriff auf die Datenbank.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
Noch kein Account? Hier anmelden.