tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
1481
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hispeedsurfer hispeedsurfer ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Beiträge
    52
    Hallo,

    ich habe verschiedenartige Tokens und suche einen passenden regulären Ausdruck, um diese zu splitten.


    Die Tokens können sein: -50-100°C, +/-5,3mV <-das letzte ist ein float, also nicht 5 und 3

    rauskommen soll: -50-100, °C, +/-, 5,3, mV <- genau so wie oben



    Kann mir da jemand helfen, welchen regulären Ausdruck ich dafür benögtige, wenn eine passender überhaupt existiert?


    Danke
    Andreas
    Geändert von hispeedsurfer (31.10.06 um 11:55 Uhr)
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.960
    Nicht ganz das was du suchst, aber mit split kenne ich mich auch nicht so gut aus. Aber das hier funktioniert:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    package de.tutorials;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
     
    /**
     * @author zeja
     */
    public class PatternMatching {
        
        private static final String DELIM = "(-[0-9]*-[0-9]*)(°C), (\\+/-)([0-9]*,[0-9]*)(mV)";
        private static final Pattern PATTERN = Pattern.compile(DELIM);
        
        public static List<String> splitData(String data){
            ArrayList<String> list = new ArrayList<String>();
            Matcher m = PATTERN.matcher(data);
            if(m.matches()){
                for(int i = 1; i <= m.groupCount( ); i++){
                    String group = m.group(i);
                    list.add(group);
                }
            }
            return list;
        }
        
        public static void main(String[] args) {
            List<String> data = splitData("-50-100°C, +/-5,3mV");
            System.out.println(data);
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    
    -50-100
    °C
    +/-
    5,3
    mV
     

  3. #3
    hispeedsurfer hispeedsurfer ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Beiträge
    52
    Hallo zeja,

    Danke für deine Antwort. Versuche immernoch hinter die Logik von Pattern zu steigen.

    So ganz war das nicht gemeint. Da habe ich mich wohl nicht deutlich genug ausgedrückt (-;.

    Es sind einzelne Strings wie:
    • -50-100°C
    • +/-5,3mV

    Kann aber auch mal nur -50 oder +250 sein. Ich habe gehoft das ich einen Verknüpfung mehrer regulärer Ausdrücke vornehmen kann, bei denen dann einer auf das Muster passt.

    Es soll quase jeder einzelne String auf ein Pattern geprüft werden.

    Wäre super wenn du noch eine Idee hättest.


    Danke
    Andreas
     

  4. #4
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.960
    So ist es vielleicht ein wenig übersichtlicher und erkennt nun auch sämtliche Dezimalzahlen und Ganze Zahlen mit und ohne Vorzeichen und auch in Bereichen, sowie mit Einheit.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    
    package de.tutorials;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
     
    /**
     * @author zeja
     */
    public class PatternMatching {
      
      //Beliebige Ganze Zahl: z.B. 50
      private static final String AN_INT = "[0-9]*";
      //Beliebige Dezimalzahl (oder ganze Zahl): z.B. 50 oder 99,9
      private static final String A_FLOAT = AN_INT + "(?:,"+AN_INT + ")?";
      //Vorzeichen +/-
      private static final String PLUS_MINUS = "\\+/-";
      //Eines der Vorzeichen +, - oder +/-
      private static final String SIGNS = "(?:\\+)|(?:-)|(?:"+PLUS_MINUS+")";
      //Beliebige Dezimalzahl mit Vorzeichen, z.B. +/- 50,5 oder -100
      private static final String SIGNED_FLOAT = "(?:"+ SIGNS + ")?" + A_FLOAT;
      //Beliebiger Dezimalzahl Bereich z.B. -50-100
      private static final String FLOAT_RANGE = SIGNED_FLOAT + "(?:-"+ SIGNED_FLOAT + ")?";
      //Ein Einheit °C oder mV
      private static final String UNIT = "(?:°C|mV)";
      //Ein Dezimalzahlbereich mit Einheit
      private static final String FLOAT_RANGE_WITH_UNIT = "(" + FLOAT_RANGE + UNIT + ")";
      private static final String DELIM = FLOAT_RANGE_WITH_UNIT + ", " + FLOAT_RANGE_WITH_UNIT;
      
      private static final Pattern PATTERN = Pattern.compile(DELIM);
      
      public static List<String> splitData(String data){
        ArrayList<String> list = new ArrayList<String>();
        Matcher m = PATTERN.matcher(data);
        if(m.matches()){
          for(int i = 1; i <= m.groupCount( ); i++){
            String group = m.group(i);
            list.add(group);
          }
        }
        return list;
      }
      
      public static void main(String[] args) {
        System.out.println(PATTERN.pattern( ));
        List<String> data = splitData("-50-100°C, +/-5,3mV");
        System.out.println(data);
      }
    }

    Bei solch langen Ausdrücken ist es auch sinnvoll diese aus Einzelteilen zusammenzusetzen. Der gesamte Ausdruck wird auch zu Beginn ausgegeben und ist absolut nicht mehr lesbar.
     

  5. #5
    hispeedsurfer hispeedsurfer ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Beiträge
    52
    Hallo zeja,

    vielen Danke für deine Mühe.
    Wenn ich das Beispiel laufen lasse, ist die Ausgabe die selbe wie die Eingabe. Keine Separierung der Daten.

    Das Ergebnis sieht bei mir so aus:

    [-50-100°C, +/-5,3mV]

    Evtl noch eine Idee?


    Gruß
    Andreas
     

  6. #6
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.960
    Guck dir die eckigen Klammern drumherum an. Du kriegst eine Liste zurück mit den beiden Elementen
    • -50-100°C
    • +/-5,3mV
    und die Liste wird durch System.out.println wie folgt ausgegeben [<element1>, <element2>] daher sieht es im ersten Moment so aus, als wenn nichts getan wurde.
     

  7. #7
    hispeedsurfer hispeedsurfer ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Beiträge
    52
    Ich glaub es fehlt mir an der passenden Ausdrucksweise oder es fehlt mir sonst irgendwo.

    In deinem Bsp ist die Eingabe:

    "-50-100°C, +/-5,3mV"


    und die Ausgabe:

    [-50-100°C, +/-5,3mV]
    also:
    • -50-100°C
    • +/-5,3mV


    aber rauskommen soll, wie du schon am Anfang richtig erkannt hattest:
    • -50-100
    • °C
    • +/-
    • 5,3
    • mV
    also:
    [-50-100, °C, +/-, 5,3, mV]
    Sorry das ich dich so nerve...

    Lg
    Andreas
     

  8. #8
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.960
    Dann beschäftige dich doch ein wenig selber mal damit. Das ist nun nicht mehr schwer hinzubekommen.

    Das was am Ende vom PatternMatcher ausgegeben wird steht in Runden Klammern, wie eben im Beispiel FLOAT_RANGE_WITH_UNIT. Also alles was du ausgegeben haben willst mit solchen Klammern einfassen und mal das Javadoc von Pattern lesen, da steht alles drin was man braucht. Versuche einfach meinen Code zu verstehen.
     

  9. #9
    hispeedsurfer hispeedsurfer ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Beiträge
    52
    >> Dann beschäftige dich doch ein wenig selber mal damit.

    Das versuche ich schon die ganze Zeit, komme aber nicht klar, deshalb habe ich ja hier ins Forum gepostet.

    Wenn ich mal probehalber versuche dein Beispiel anzuwenden hört es schon auf wenn ich versuche nur °C und mV auszugeben

    Bei Regex ".*(°C|mV)" ist die Ausgabe [mV], °C aber nicht
    Bei Regex ".*(?:°C|mV)" habe ich gar kein Ergebnis [].

    Wie das den mit den non-capturing groups?

    Gruß
    Andreas
     

  10. #10
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.960
    Bei Regex ".*(?:°C|mV)" habe ich gar kein Ergebnis [].

    Wie das den mit den non-capturing groups?
    Gruppen die mit (?: beginnen sind non-capturing groups. Das bedeutet alles was dort zwischen den Klammern ( ) steht wird zwar erkannt, aber nicht als eigenes Ergebnis vom Matcher ausgegeben.

    Besser hab ichs gerade nicht hinbekommen. Kenne mich damit auch nicht wirklich gut aus.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
    package de.tutorials;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
     
    /**
     * @author zeja
     */
    public class PatternMatching {
      
      //Beliebige Ganze Zahl: z.B. 50
      private static final String AN_INT = "[0-9]*";
      //Beliebige Dezimalzahl (oder ganze Zahl): z.B. 50 oder 99,9
      private static final String A_FLOAT = AN_INT + "(?:,"+AN_INT + ")?";
      //Vorzeichen +/-
      private static final String PLUS_MINUS = "\\+/-";
      //Eines der Vorzeichen +, - oder +/-
      private static final String SIGNS = "\\+|-|"+PLUS_MINUS+"";
      //Beliebige Dezimalzahl mit Vorzeichen, z.B. +/- 50,5 oder -100
      private static final String SIGNED_FLOAT = "(?:"+ SIGNS + ")?" + A_FLOAT;
      //Beliebiger Dezimalzahl Bereich z.B. -50-100
      private static final String FLOAT_RANGE = SIGNED_FLOAT + "-"+ SIGNED_FLOAT;
      //Ein Einheit °C oder mV
      private static final String UNIT = "(?:°C|mV)";
      //Ein Dezimalzahlbereich mit Einheit
      private static final String FLOAT_RANGE_WITH_UNIT = "(?:(" + FLOAT_RANGE  +")|(?:(" + SIGNS + ")(" + A_FLOAT +")))("+ UNIT + ")";
      private static final String DELIM = FLOAT_RANGE_WITH_UNIT + ", " + FLOAT_RANGE_WITH_UNIT;
      
      private static final Pattern PATTERN = Pattern.compile(DELIM);
      
      public static List<String> splitData(String data){
        ArrayList<String> list = new ArrayList<String>();
        Matcher m = PATTERN.matcher(data);
        if(m.matches()){
          for(int i = 1; i <= m.groupCount( ); i++){
            String group = m.group(i);
            //nicht schön aber geht
           if(group != null){
                list.add(group);
            }
          }
        }
        return list;
      }
      
      public static void main(String[] args) {
        System.out.println(PATTERN.pattern( ));
        List<String> data = splitData("-50-100°C, +/-5,3mV");
        System.out.println(data);
      }
    }
     

  11. #11
    hispeedsurfer hispeedsurfer ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Beiträge
    52
    Danke zeja

    nach einigem rumprobieren und deinen Vorlagen hab ich nun endlich hinbekommen.



    Gruß
    Andreas
     

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 25.06.10, 12:07
  2. URL prüfen mit Regex
    Von HerbertJ im Forum PHP
    Antworten: 3
    Letzter Beitrag: 22.12.09, 11:42
  3. Antworten: 1
    Letzter Beitrag: 21.01.08, 16:58
  4. Antworten: 0
    Letzter Beitrag: 01.08.06, 02:22
  5. Vor- und Zuname Userdaten per regex prüfen.
    Von Sandra Haupt im Forum PHP
    Antworten: 4
    Letzter Beitrag: 21.07.04, 04:59