tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
25
ZUGRIFFE
938
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von SonicBe@m
    SonicBe@m SonicBe@m ist offline Mitglied Brokat
    Registriert seit
    Jan 2002
    Ort
    München
    Beiträge
    447
    Hallo zusammen,

    evtl kann mir einer helfen und sagen ob sowas in Regex überhaupt möglich ist.

    Folgenden text hab ich als Beispiel

    formel(test1:test2:test3)

    nun möchte ich via regex jeden einzelnen Teil rauslesen.
    wäre der Text wie folgt:
    test1:test2:test3
    könnte ich das ganz einfach mit (.*?):+|(.*?)$
    machen, allerdings hab ich dann 3 Gruppen.

    Ausserdem ist in dem Beispiel dann der formel() teil auch nicht enthalten und ich kann mir leider nicht mehr helfen.

    Vielleicht kennt ja einer eine möglichkeit wie ich das Pattern schreiben muss um folgendes Ergebniss zu erhalten wenn ich folgenden Wert übergebe.
    formel(test1:test2:test3)
    return bsp. [test1,test2,test3] < array

    viele Grüße
    Stephan
     
    Moep :)

  2. #2
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Versuch mal das hier:

    Code :
    1
    
    .*\((.*):(.*):(.*)\)
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  3. #3
    Avatar von SonicBe@m
    SonicBe@m SonicBe@m ist offline Mitglied Brokat
    Registriert seit
    Jan 2002
    Ort
    München
    Beiträge
    447
    Oh hab natürlich wieder ein wichtiges Detail vergessen....
    Der Wert in den Klammern soll natürlich unendlich sein *g*
    formel(a,b,c,d,N)

    Ich mein natürlich könnte ich hergehen und das ganze mit 2 durchläufen machen aber das will ich ja erstmal nicht.
    allein die Tatsache das folgendes nicht das bringt was man glauben mag :

    formel(test1:test2:test3)
    regex =
    formel\((.*?):+\)



    Zitat Zitat von timestamp Beitrag anzeigen
    Versuch mal das hier:

    Code :
    1
    
    .*\((.*):(.*):(.*)\)
    Geändert von SonicBe@m (23.06.10 um 12:55 Uhr)
     
    Moep :)

  4. #4
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Ich glaube hier wäre es einfacher, den Teil aus der Klammer zu holen und ihn dann mit split in ein Array aufzuteilen.
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  5. #5
    Avatar von SonicBe@m
    SonicBe@m SonicBe@m ist offline Mitglied Brokat
    Registriert seit
    Jan 2002
    Ort
    München
    Beiträge
    447
    Ja das es anders geht ist mir bewusst, ich möchte allerdings das ganze in Regex abbilden.
    eigentlich gehts mir hauptsächlich darum ob Regex genau dieses Problem überhaupt abhandeln kann oder ob das schon zuviel ist.
    Zitat Zitat von timestamp Beitrag anzeigen
    Ich glaube hier wäre es einfacher, den Teil aus der Klammer zu holen und ihn dann mit split in ein Array aufzuteilen.
     
    Moep :)

  6. #6
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    Code :
    1
    2
    3
    
    abc:def:ghi:jkl
     
    (:([^:]*))

    ? Ergebnis im array[2] ?

    mfg chmee

    p.s.: Naja, fast, aber etwa so einfach müsste die Sache lösbar sein

    Code :
    1
    2
    3
    
    (abc:def:ghi:jkl)
     
    (:?)([^:()]*)
    Es geht sicherlich noch schöner, denn Felder [0], [n] und [n-1] bleiben leer.
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  7. #7
    Avatar von SonicBe@m
    SonicBe@m SonicBe@m ist offline Mitglied Brokat
    Registriert seit
    Jan 2002
    Ort
    München
    Beiträge
    447
    uff ehm Ja sehr cool!
    Kannste mal erklären was da jetzt genau passiert? ich blick da grad nicht durch
    Code :
    1
    
    PS: (?::?)([^:()]*)
    somit wäre dann auch das 2te Array weg.

    Ist es jetzt hier eigentlich möglich das formel() noch mit in das pattern zu nehmen welches dann rausgeworfen wird? also sowas wie
    Code :
    1
    
    formel\((?::?)([^:()]*)\)

    Zitat Zitat von chmee Beitrag anzeigen
    Code :
    1
    2
    3
    
    abc:def:ghi:jkl
     
    (:([^:]*))
    ? Ergebnis im array[2] ?

    mfg chmee

    p.s.: Naja, fast, aber etwa so einfach müsste die Sache lösbar sein

    Code :
    1
    2
    3
    
    (abc:def:ghi:jkl)
     
    (:?)([^:()]*)
    Es geht sicherlich noch schöner, denn Felder [0], [n] und [n-1] bleiben leer.
    Geändert von SonicBe@m (23.06.10 um 13:25 Uhr)
     
    Moep :)

  8. #8
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    Das erste ist recht einfach, ich gruppiere das Suchpattern mehrere[nicht:]).. Das zweite ist nur die Erweiterung des Nicht mit () Klammer auf und zu.

    Studierfeld erster Wahl ist natürlich http://www.regex-tester.de/regex.html

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von SonicBe@m Beitrag anzeigen
    Ja das es anders geht ist mir bewusst, ich möchte allerdings das ganze in Regex abbilden.
    eigentlich gehts mir hauptsächlich darum ob Regex genau dieses Problem überhaupt abhandeln kann oder ob das schon zuviel ist.
    Nein, das geht nicht (vorausgesetzt ich habe richtig verstanden was du willst). Du hast im Match nachher lediglich genau soviel Gruppen wie du Klammern (Gruppierungen) angegeben hast (plus die alles umfassende Gruppe).

    Du könntest höchstens eine große Anzahl an Gruppierungen angeben:
    Code :
    1
    
    ([^:]+)?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?(?::([^:]+))?
    ... und dann schauen wieviel Gruppen gefüllt sind.

    Allerdings würde ich dir empfehlen einfach das innere der Klammern zu extrahieren und dann am Doppelpunkt zu splitten.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  10. #10
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    Ich bin mit dem Kopf leider schon wieder woanders. Folgend:
    Code :
    1
    2
    3
    4
    5
    
    formel(test1:test2:test3)
     
    '/(formel\()+ (([^:].*):?)+ \)/Sx'
     
    -> array[2][0] = test1:test2:test3
    Welches man durch das obige regex schleifen könnte. Es wird doch mit Sicherheit eine Möglichkeit geben, dies in einem Regex zu realisieren. Aber das bleibt Deine Aufgabe

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  11. #11
    Avatar von snoopysalive
    snoopysalive snoopysalive ist offline Mitglied Silber
    Registriert seit
    Jun 2007
    Beiträge
    77
    Also, ich glaub ja auch, dass das Abbilden auf einen einzigen Regex hier nicht klug wäre. Wenn ich dich recht verstanden habe, dann willst du ja beliebig viele durch Doppelpunkt voneinander getrennte Parameter eines Methodenaufrufs extrahieren.

    Erster Lösungsansatz:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    
    String  s = "formel(test1:test2:test3)";
    Pattern p = Pattern.compile(".*\\(([^:)]+(:[^:)]+)*)\\).*");
    Matcher m = p.matcher(s);
    if (m.matches()) {
        String[] params = m.group(1).split(":");
        // params enthält nun die Parameter
    }

    Zweiter Ansatz:
    Code java:
    1
    2
    3
    
    String  s = "formel(test1:test2:test3)".replaceAll("^[^(]+\\(", "").replaceAll("\\)$", "");
    String[] params = s.split(":");
    // params enthält nun die Parameter

    Gruß
    Matthias
    Geändert von snoopysalive (23.06.10 um 15:46 Uhr)
     

  12. #12
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Ich rate mal drauf los, dass diese Lösung immer nicht genommen wird, da der Threadersteller lieber Regex verwenden möchte
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  13. #13
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    Nach ner Spazierfahrt auf m Rad muss ich deepthroats Aussage unterstreichen. Mit einer Regex wirds nicht gehen. Man kann in einer Regex nunmal nicht eine unbekannte Anzahl Wiederholungen einer Gruppierung durchführen. Deepthroats Versuch ist die einzig funktionierende, indem man die Maximalanzahl begrenzt. Das wiederum beschränkt die Funktionsausgabe, also am Ende doch 2x Regex oder die Variante mit Explode/Split und Doppelpunkt.

    mfg chmee
    Geändert von chmee (23.06.10 um 16:18 Uhr) Grund: man mit einem n
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  14. #14
    Avatar von snoopysalive
    snoopysalive snoopysalive ist offline Mitglied Silber
    Registriert seit
    Jun 2007
    Beiträge
    77
    Dann kann ich nur sagen, dass es nicht möglich ist, dieses Problem mit Hilfe eines einzigen regulären Ausdrucks und nur unter Verwendung von Match-Gruppen zu lösen, solange der Anspruch besteht, dass die Parameterliste beliebig lang sein darf.
     

  15. #15
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    zitiert: Man kann in einer Regex nunmal nicht eine unbekannte Anzahl Wiederholungen einer Gruppierung durchführen.

    Sollte wohl genau das heissen..

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 25.06.10, 12:07
  2. Antworten: 1
    Letzter Beitrag: 21.01.08, 16:58
  3. Regex-Hilfe für Anfänger und Profis
    Von Neurodeamon im Forum Coders Talk
    Antworten: 10
    Letzter Beitrag: 29.08.06, 09:35
  4. [RegEx] Hilferuf eines RegEx-Desperados
    Von ManicMarble im Forum Coders Talk
    Antworten: 15
    Letzter Beitrag: 16.06.05, 08:49
  5. Parsing: RegEx mit '&', RegEx-Kenner gefragt
    Von Kachelator im Forum PHP
    Antworten: 8
    Letzter Beitrag: 21.04.04, 09:16