staging.inyokaproject.org

Regex - nur eine Ausgabe per identischem Treffer

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

natraj7

Anmeldungsdatum:
7. Oktober 2013

Beiträge: 27

Hallo zusammen, ich würde gerne einen Text durchsuchen wo ich mehrere Treffer mit fast identischem Inhalt haben werde. Wenn das Ergebnis identisch ist, soll nur jeweils ein Treffer angezeigt werden

angefangener Regex: \-...\-

zu durchsuchen

11-mh0-11
22-mh0-22
33-mh0-33
11-de0-11
22-de0-22

erwünschte Beispiel Ausgabe:

11-mh0-11
11-de0-11

oder

33-mh0-33
11-de0-11

Hat jemand eine Idee wie ich nur jeweils einen Treffer ausgeben kann? Welche strings mit welchen Zahlen ausgegeben werden ist egal, Hauptsache nur 1 Treffer wird ausgegeben, falls es mehrere, identische Treffer gibt. Im Beispiel oben gibt es mh0 drei mal und de0 zwei mal. Einmal mh0 und einmal de0 reicht aber.

Danke! 😀

Bearbeitet von rklm:

Codeblöcke. Bitte beachte Forum/Syntax!

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

In welcher Sprache?

In der Bash gibt es bspw. head:

ls | head -n1

natraj7

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2013

Beiträge: 27

Java

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Zeig doch mal ein MWE von deinem bisherigen Code.

natraj7

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2013

Beiträge: 27

seahawk1986 schrieb:

Zeig doch mal ein MWE von deinem bisherigen Code.

ich bin eigentlich kein Programmierer. Ich hab nur eine Applikation die mit Java läuft und über ein GUI - Regex interpretieren kann. Ich möchte jetzt eine Datenbank über ein Browser-Suchfeld mit Regex durchsuchen. Da die Applikation über Java läuft braucht es Java Regex, aber ich dachte das ist nicht ganz so wichtig wenn ich zumindest eine Idee bekomme wie es gehen könnte. Ich bin nicht so schrecklich Erfahren in Regex.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Es hängt stark davon ab, wie sie Suche implementiert ist - wenn die Treffer in unterschiedlichen Zeilen bzw. Strings stecken, aber der Regex auf jede Zeile/String neu angewendet wird, lässt sich die Zahl der Treffer nicht über den Regulären Ausdruck limitieren.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

natraj7 schrieb:

ich bin eigentlich kein Programmierer. Ich hab nur eine Applikation die mit Java läuft und über ein GUI - Regex interpretieren kann. Ich möchte jetzt eine Datenbank über ein Browser-Suchfeld mit Regex durchsuchen.

Dann müssten wir erst mal wissen, ob die Regex in Java oder in der DB interpretiert werden.

Da die Applikation über Java läuft braucht es Java Regex, aber ich dachte das ist nicht ganz so wichtig wenn ich zumindest eine Idee bekomme wie es gehen könnte. Ich bin nicht so schrecklich Erfahren in Regex.

Hier ist aber das Umfeld sehr wichtig. Du willst ja eine Filterung machen, die über einzelne Datensätze hinaus geht. Damit muss aber Zustand über den aktuellen Datensatz hinaus gespeichert werden. Das tun übliche Suchmasken, die SQL-Abfragen generieren, aber nicht. Am einfachsten wäre es mit awk:

1
2
3
4
5
6
7
8
9
$ cat data
11-mh0-11
22-mh0-22
33-mh0-33
11-de0-11
22-de0-22
$ awk -F - '{if(!map[$2]){map[$2]=1;print}}' data
11-mh0-11
11-de0-11

Wenn das ganze in einer relationalen DB sitzt, dann ist eigentlich das Schema zu hinterfragen, denn Du speicherst offensichtlich drei Werte in einer Spalte. Jedenfalls müsste man eine spezielle Abfrage schreiben. Ich bezweifele, dass das mit der Anwendung geht, es sei denn, Du kannst das SQL für die Abfrage selbst eingeben.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Mit PostgreSQL geht das so

1
2
3
select min(v) as v
from t
group by substring(v from '-([^-]+)-');

Ich habe das mal bei http://sqlfiddle.com/ mit PostgreSQL 9.6 ausprobiert mit folgender Schema-Definition

1
2
3
4
5
6
7
create table t ( v varchar(100) not null );
insert into t values
('11-mh0-11'),
('22-mh0-22'),
('33-mh0-33'), 
('11-de0-11'),
('22-de0-22');

Falls Du Dir anschauen willst, was die Regex liefert:

1
2
3
select substring(v from '-([^-]+)-') as extracted, min(v)
from t
group by extracted;

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Hier noch eine Abfrage mit zufälliger Auswahl

1
2
3
4
5
6
7
8
9
with tab as
(
select v, random() as z, substring(v from '-([^-]+)-') as x
from t
)
select t1.v --, t1.x
from tab t1
join (select x, min(z) as z from tab group by x) as t2
  on t1.x=t2.x and t1.z=t2.z;

natraj7

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2013

Beiträge: 27

@seahawk1986 In der Anleitung zu der App steht das es in Java Regex interpretiert wird.

@RKLM

Dann müssten wir erst mal wissen, ob die Regex in Java oder in der DB interpretiert werden.

Das ist Java Regex

Hier ist aber das Umfeld sehr wichtig. Du willst ja eine Filterung machen, die über einzelne Datensätze hinaus geht. Damit muss aber Zustand über den aktuellen Datensatz hinaus gespeichert werden. Das tun übliche Suchmasken, die SQL-Abfragen generieren, aber nicht.

Schade, dann muss ich es anders versuchen. Ich dachte evtl. das man mit lookahead oder lookbehind was machen kann aber wenn das über Datensätze hinweg nicht funktioniert, dann bringt das auch nichts.

SQL Abfragen kann ich in der App keine machen. Ich vermute das es eine Postgre-DB ist. Da werde ich mal mit dem Admin sprechen ob der die SQL Abfragen für mich machen kann.

Tausend Dank RKLM für die detaillierten Beispiele und danke auch an Seahowk1986 und ChickenLipsRfun2eat für eueren Rat!

Antworten |