Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
OT: Reguläre Ausdrücke mit Ersetzungsgruppen
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2146
Location: Europe

PostPosted: Tue Jun 30, 2009 9:27 pm    Post subject: OT: Reguläre Ausdrücke mit Ersetzungsgruppen Reply with quote

Moin zusammen,

hab das wohl ein bisschen schwierig umschrieben.
Ich möchte auf jeden Fall die Kölner Phonetik implementieren. Am liebsten als regulären Ausdruck.
Da in diesem Gebiet meine Kenntnisse nicht wirklich tiefgehend sind, habe ich folgende Frage:

Bekomme ich irgendwie eine unterschiedliche Ersetzung für verschiedene "Match-Gruppen" hin ohne es in mehrere reguläre Ausdrücke auseinander zupflücken?

Ich will durch dieses (pseudo regulärer Ausdruck):
Code:
/((a|e|i|o|u)|(m|n))/(0|6)/gi

alle "a", "e", "i", "o" und "u" in "0" und
alle "m" und "n" in "6"
umgewandelt werden.

Leider finde ich aber nur Möglichkeiten den gesamten auf den regulären Ausdruck zutreffenden Bereich und nicht einzelne untergruppen zu unterteilen.

Danke für Tipps
Manuel
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
think4urs11
Bodhisattva
Bodhisattva


Joined: 25 Jun 2003
Posts: 6659
Location: above the cloud

PostPosted: Tue Jun 30, 2009 11:18 pm    Post subject: Reply with quote

abgesehen von der sportlichen Herausforderung - warum soll es denn ein Regex/Replace sein und nicht mehrere?
Spätestens bei der Ersetzung von 'C' wird das ganze in jedem Fall recht komplex.
_________________
Nothing is secure / Security is always a trade-off with usability / Do not assume anything / Trust no-one, nothing / Paranoia is your friend / Think for yourself
Back to top
View user's profile Send private message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2146
Location: Europe

PostPosted: Wed Jul 01, 2009 7:50 am    Post subject: Reply with quote

Hmm, alle/viele Programmiersprachen bieten es an regulaere Ausdruecke vorher zu "kompilieren", wovon ich davon ausgegangen bin, dass dies ein zeitintensiver Vorgang ist.
Da das ganze ueber auf Tabellen einer Datenbank zugreift, duerfte es recht oft aufgerufen werden.

...und natuerlich die sportliche Herausforderung!

EDIT: Obwohl das "kompilieren" ja nur einmal pro SELECT-Anweisung ausgefuert werden muesste.
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1912
Location: Germany

PostPosted: Wed Jul 01, 2009 1:03 pm    Post subject: Reply with quote

Da es in ja nur 9 (10, wenn man das "ignoriere alleinstehende Hs" mitzählt) Klassen gibt, würde ich sagen, dass du einfach für jede Klasse eine RE baust (allein schon der Übersichtlichkeit halber). Die kannst du denn auch bereits kompilieren :) (da es einfache REs sind, sollte das kompilieren aber net aufwändig sein), und die kompilierten denn bei den SELECTs anwenden (oder so)
_________________
Inter Deum Et Diabolum Semper Musica Est.
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Wed Jul 01, 2009 1:44 pm    Post subject: Reply with quote

Auf den ersten Blick sehe ich da überhaupt keinen Bedarf für reguläre Ausdrücke. Eine Schleife + case reicht doch vollkommen.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1912
Location: Germany

PostPosted: Wed Jul 01, 2009 2:01 pm    Post subject: Reply with quote

Knieper wrote:
Auf den ersten Blick sehe ich da überhaupt keinen Bedarf für reguläre Ausdrücke. Eine Schleife + case reicht doch vollkommen.

Dachte ich auch erst ... aber solcher Fälle wie "P wenn es vor einem H steht" oder so sind sicherlich mit REs besser zu erschlagen als mit irgendwelchen selbstgebauten (wenn auch simplen) Parsern
_________________
Inter Deum Et Diabolum Semper Musica Est.
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Wed Jul 01, 2009 2:11 pm    Post subject: Reply with quote

Das denke ich nicht und wenn man sich dieses Thema durchliest, wird meine Aussage auch bestätigt. Einen lesbaren, schnellen <25-Zeiler durch unlesbare und lahme reguläre Ausdrücke zu ersetzen ist softwaretechnisch nicht sinnvoll.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
chilla
Apprentice
Apprentice


Joined: 12 Dec 2004
Posts: 203
Location: Heidelberg, Germy

PostPosted: Fri Jul 03, 2009 9:48 pm    Post subject: Reply with quote

Ich würde die 10 Regeln auch in jeweils eine regex setzen.

Von regulären Ausdrücken würde ich nur bei zeitkritischen Programmen abraten. Wenn die Laufzeit relativ unerheblich ist, sind sie dafür wie geschaffen. Mit /../x sind sie zudem auch mit ein wenig erfahrung gut lesbar.

Insbesondere wenn du nacher lookahread und lookbehind nutzt, wirst du dich freuen, dass du reguläre Ausdrücke verwendest :-)
_________________
"Democracy is two wolves and a sheep voting on what to have for dinner. Liberty is two wolves attempting to have a sheep for dinner and finding a well-informed, well-armed sheep."

TU-BS Wiki
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Sat Jul 04, 2009 1:40 pm    Post subject: Reply with quote

Reguläre Ausdrücke - und noch schlimmer regexes - sind softwaretechnisch eine ziemlich Krücke. Für triviale Sachen sind sie zu komplex (unnötiger Ballast im Programm, Gefahr von DoS-Attacken, oft sicherheitsrelevante Fehler in den Bibliotheken), für nichttriviale Sachen sind Parser(generatoren) die bessere Wahl. Ich habe es mal runtergekritzelt, den Boilerplate könnt Ihr Euch wegdenken und ja, mit Closures etc. ist es nicht die schnellste Variante:
Code:

// Koelner Phonetik
// http://de.wikipedia.org/wiki/Kölner_Phonetik

#nowarn "62"

let koeln s =
    let res = ref []
    let str = String.lowercase s
    let len = str.Length - 1

    // ---- encode
    // set result
    let sr c =
        res := c::!res

    for i=0 to len do
        let after l = i>0 && (List.contains s.[i-1] l)
        let initial = i=0
        let not_before l = i<len && not (List.contains s.[i+1] l) || i=len
       
        match str.[i] with
        |'a'|'e'|'i'|'j'|'o'|'u'|'y'|'ä'|'ö'|'ü' -> sr '0'
        |'b' -> sr '1'
        |'p' when not_before ['h'] -> sr '1'
        |'p' -> sr '3'
        |'d'|'t' when not_before ['c';'s';'z'] -> sr '2'
        |'d'|'t' -> sr '8'
        |'f'|'v'|'w' -> sr '3'
        |'g'|'k'|'q' -> sr '4'
        |'c' when (not initial || (not_before ['a';'h';'k';'l';'o';'q';'r';'u';'x'])) && (initial || not_before ['a';'h';'k';'o';'q';'u';'x'] || after['s';'z']) -> sr '8'
        |'c' -> sr '4'
        |'x' when after ['c';'k';'q'] -> sr '8'
        |'x' -> sr '4'
        |'l' -> sr '5'
        |'m'|'n' -> sr '6'
        |'r' -> sr '7'
        |'s'|'z'|'ß' -> sr '8'
        | _ -> ()

    // ---- remove duplicates
    let uniq l =
        let f (last_elem,l1) elem =
            match elem with
            | e when e=last_elem -> (elem,l1)
            | _ -> (elem,elem::l1)

        let (_,r) = List.fold f (' ',[]) l
        r

    // --- remove zeros
    let filter l =
        let f = List.filter (fun n -> n<>'0')
        match l with
        | '0'::_ -> '0'::(f l)
        | _ -> f l

    let tostring l = List.fold (fun s c -> s^c.ToString()) "" l

    !res |> uniq |> filter |> tostring

[<EntryPoint>]
let main args =
    Array.iter (fun x -> printfn "%s" (koeln x)) args
    0


Allerdings widersprechen sich mMn. Wikipedia und die erste Tabelle im angeg. Paper, zB.:
Hoffmann: -0336066 -> 03606 -> 0366 (Autor: 036)
Wagner: 304607 -> _ -> 3467 (Autor: 367)
Schmidt: 88-6022 -> 8602 -> 862 (Autor: 8628)

PS.: Nagelt mich nicht auf Fehler fest, ich habe nicht viel Zeit investiert.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2146
Location: Europe

PostPosted: Sun Jul 05, 2009 9:29 pm    Post subject: Reply with quote

Nun wird es noch ein bisschen Offtopic:
Ich will das ganze in ja in einer Datenbank nutzen (Postgre).
Weiss jemand von euch ob man bei Hostingangeboten standardmäßig externe PHP/C++/was-auch-immer Funktionen aus der Postgre-Datenbank aufrufen kann oder ist das nochmalerweise ein kostenpflichtiges Zusatzangebot?
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Tue Jul 07, 2009 10:28 am    Post subject: Reply with quote

manuels wrote:
Weiss jemand von euch ob man bei Hostingangeboten standardmäßig externe PHP/C++/was-auch-immer Funktionen aus der Postgre-Datenbank aufrufen kann oder ist das nochmalerweise ein kostenpflichtiges Zusatzangebot?

Hängt vom Hoster ab, oft sind die PL/Schlagmichtot nicht installiert - also einfach mal nachfragen. Normalerweise - ich weiß ja nicht, was Du vorhast - werden solche Sachen aber nicht von der DB gemacht, sondern von der Software davor.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2146
Location: Europe

PostPosted: Tue Jul 07, 2009 1:02 pm    Post subject: Reply with quote

Hmm, bei MySQL macht das die DB (soundex).
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
Gibheer
Guru
Guru


Joined: 27 Dec 2004
Posts: 300

PostPosted: Tue Jul 07, 2009 1:28 pm    Post subject: Reply with quote

Also PostgreSQL hat Volltextsuche, SoundEx, Metaphone usw.
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Tue Jul 07, 2009 3:11 pm    Post subject: Reply with quote

manuels wrote:
Hmm, bei MySQL macht das die DB

Hättest Du gleich geschrieben, was das eigentl. Problem ist, dann hätte man Dir auch andere Lösungsvorschläge unterbreiten können.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2146
Location: Europe

PostPosted: Tue Jul 07, 2009 6:03 pm    Post subject: Reply with quote

steht doch im zweiten Beitrag.
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Tue Jul 07, 2009 6:59 pm    Post subject: Reply with quote

Nö, da steht nur, daß Du es über eine DB laufen lassen willst. Das ist nicht das Kernproblem. Also nochmal: beschreibt die eigentl. Aufgabe, Eure angedachte Lösung und Euer Umsetzungsproblem, sonst kann man schlecht helfen.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2146
Location: Europe

PostPosted: Wed Jul 08, 2009 7:35 am    Post subject: Reply with quote

Das Problem an sich ist recht einfach: es sollen alle (nach der Koelner Phonetik) gleichklingende Personenamen aus einer PostgreSQL-Datenbank herausgesucht werden.

EDIT: Zur Präzision: Nicht alle Gleichklingende sondern alle Personennamen sollen gefunden werden, die einem bestimmten Personennamen ähnlichklingen.
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Thu Jul 09, 2009 7:39 am    Post subject: Reply with quote

Die Nachnamen hast Du doch sicher in einer Spalte. Kannst Du nicht eine weitere mit den Werten der Kölner P. anlegen und select und insert im Frontend anpassen? Du hast doch sicher nicht vor, die Berechnung bei jedem select durchzuführen...
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2146
Location: Europe

PostPosted: Thu Jul 09, 2009 12:14 pm    Post subject: Reply with quote

Das mit der Extra-Spalte waere ratsam.
Es waere allerdings eleganter wenn nicht das Frontend das "uebersetzen" in die Koelner Phonetik uebernimmt, sondern ein Datenbank-Trigger, der auf Aenderungen des Personennamen lauert.
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Thu Jul 09, 2009 12:26 pm    Post subject: Reply with quote

"Elegant" ist da relativ. Ich persönlich sehe DBs nur als das an, was sie sind: Datenspeicher. Berechnungen gehören immer in die Anwendung,
1. weil die es besser kann
2. weil es besser skaliert

Du musst ja auch an Doppelnamen etc. denken und dann wird Dein Hack ziemlich komplex.

Quote:
der auf Aenderungen des Personennamen lauert

Das merkt doch sicherlich auch die Anwendung.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum