View previous topic :: View next topic |
Author |
Message |
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
Posted: Tue Jun 30, 2009 9:27 pm Post subject: OT: Reguläre Ausdrücke mit Ersetzungsgruppen |
|
|
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 |
|
|
think4urs11 Bodhisattva
Joined: 25 Jun 2003 Posts: 6659 Location: above the cloud
|
Posted: Tue Jun 30, 2009 11:18 pm Post subject: |
|
|
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 |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
Posted: Wed Jul 01, 2009 7:50 am Post subject: |
|
|
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 |
|
|
Necoro Veteran
Joined: 18 Dec 2005 Posts: 1912 Location: Germany
|
Posted: Wed Jul 01, 2009 1:03 pm Post subject: |
|
|
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 |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Wed Jul 01, 2009 1:44 pm Post subject: |
|
|
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 |
|
|
Necoro Veteran
Joined: 18 Dec 2005 Posts: 1912 Location: Germany
|
Posted: Wed Jul 01, 2009 2:01 pm Post subject: |
|
|
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 |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Wed Jul 01, 2009 2:11 pm Post subject: |
|
|
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 |
|
|
chilla Apprentice
Joined: 12 Dec 2004 Posts: 203 Location: Heidelberg, Germy
|
Posted: Fri Jul 03, 2009 9:48 pm Post subject: |
|
|
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 |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Sat Jul 04, 2009 1:40 pm Post subject: |
|
|
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 |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
Posted: Sun Jul 05, 2009 9:29 pm Post subject: |
|
|
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 |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Tue Jul 07, 2009 10:28 am Post subject: |
|
|
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 |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
|
Back to top |
|
|
Gibheer Guru
Joined: 27 Dec 2004 Posts: 300
|
|
Back to top |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Tue Jul 07, 2009 3:11 pm Post subject: |
|
|
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 |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
|
Back to top |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Tue Jul 07, 2009 6:59 pm Post subject: |
|
|
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 |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
Posted: Wed Jul 08, 2009 7:35 am Post subject: |
|
|
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 |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Thu Jul 09, 2009 7:39 am Post subject: |
|
|
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 |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
Posted: Thu Jul 09, 2009 12:14 pm Post subject: |
|
|
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 |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Thu Jul 09, 2009 12:26 pm Post subject: |
|
|
"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 |
|
|
|