Like Tree2Danke
  • 1 Beitrag von HonniCilest
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
1739
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    BaseBallBatBoy ist offline Mitglied Brokat
    Registriert seit
    Feb 2007
    Beiträge
    258
    Hallo!

    Ich will alle Zahlen in einem Text finden.

    Beispiel:
    "test1 tes2t 3test 100 200 test"
    Sollte 100 und 200 ergeben

    Mein Regex: "^\d+\s|\s\d+$|\s\d+\s|^\d+$"
    liefert aber nur 100

    Was kann man da also unternehmen?
    PS: wie die Zahlen genau aussehen, weiss ich auch nicht im voraus. Es könnte auch 1000 stehen.

    Gruss
    BBBB
     

  2. #2
    BaseBallBatBoy ist offline Mitglied Brokat
    Registriert seit
    Feb 2007
    Beiträge
    258
    erledigt
    \d{1,}
     

  3. #3
    BaseBallBatBoy ist offline Mitglied Brokat
    Registriert seit
    Feb 2007
    Beiträge
    258
    sorry, das wars ja auch nicht, da kommen 1,2,3 auch mit.... Irgend eine Idee um Alleinstehende Nummern zu finden?
     

  4. #4
    Avatar von vfl_freak
    vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.380
    Moin,

    schau mal hier in die API
    http://download.oracle.com/javase/6/...x/Pattern.html

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  5. #5
    Avatar von Fabio Hellmann
    Fabio Hellmann ist offline Mitglied Platin
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    528
    Hi,
    also ich habe da selber erst einmal ein wenig rumtüfteln müssen. Bin nun aber auf eine Lösung gekommen.
    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
    
        public List<Integer> extractNumbers(String string) {
            List<Integer> foundValues = new ArrayList<Integer>();
            
            int indexOf = 0;
            while(indexOf != -1) {
                String firstMatch = getFirstMatch(string, " (\\d+) ", indexOf);
                if(firstMatch != null) {
                    // Damit der gleiche String nicht nochmal gefunden wird +1
                    indexOf = string.indexOf(firstMatch)+1;
                    foundValues.add(Integer.valueOf(Integer.parseInt(firstMatch.replaceAll(" ", ""))));
                } else {
                    indexOf = -1;
                }
            }
            
            return foundValues;
        }
     
        private String getFirstMatch(String string, String regex, int start) {
            Pattern pattern = Pattern.compile(regex);
            Matcher m = pattern.matcher(string);
            while(m.find(start)) {
                return m.group(1);
            }
            return null;
        }

    Gruß

    Fabio
    Geändert von Fabio Hellmann (18.11.11 um 14:14 Uhr)
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Homepage: Fabio Hellmann
    Projekt: Student Organizer
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  6. #6
    BaseBallBatBoy ist offline Mitglied Brokat
    Registriert seit
    Feb 2007
    Beiträge
    258
    Oh sorry, ich habe erst jetzt gesehen, dass ich da im Java Forum gelandet bin... mein Fehler.

    Das ganze wäre eigentlich in VBA. Aber deine Antwort sagt eigentlich schon das wesentliche: nur regex alleine kann das nicht. Also werde ich mal vesuchen deine Idee nach VBA umzuschreiben. Danke dir!

    @Admin: move topic please
     

  7. #7
    Avatar von Fabio Hellmann
    Fabio Hellmann ist offline Mitglied Platin
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    528
    Ok. Du kannst deine Lösung in VBA dann auch noch posten, damit wir das komplett haben.

    Wenn das Problem dann gelöst ist, kannst du das Thema auch als erledigt markieren.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Homepage: Fabio Hellmann
    Projekt: Student Organizer
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  8. #8
    Avatar von HonniCilest
    HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    741
    Muss es unbedingt Regex sein? Wenn nein, anderer Vorschlag:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    SearchString = "test1 tes2t 3test 100 200 test"
        SearchTokens = Split(SearchString)
         
        For Each SearchToken In SearchTokens
            If IsNumeric(SearchToken) Then
                MsgBox SearchToken
            End If
        Next SearchToken

    In diesem Beispiel werden auch Zahlen mit Zahlentrennzeichen gefunden, entweder ist das in deinem Fall egal oder man müsste noch zusätzlich darauf reagieren. Andere Frage, ist dein Text ein richtiger Text, d.h. kommen da auch Satzzeichen vor?
    BaseBallBatBoy bedankt sich. 
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  9. #9
    BaseBallBatBoy ist offline Mitglied Brokat
    Registriert seit
    Feb 2007
    Beiträge
    258
    Zitat Zitat von HonniCilest Beitrag anzeigen
    Muss es unbedingt Regex sein? Wenn nein, anderer Vorschlag:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    SearchString = "test1 tes2t 3test 100 200 test"
        SearchTokens = Split(SearchString)
         
        For Each SearchToken In SearchTokens
            If IsNumeric(SearchToken) Then
                MsgBox SearchToken
            End If
        Next SearchToken

    In diesem Beispiel werden auch Zahlen mit Zahlentrennzeichen gefunden, entweder ist das in deinem Fall egal oder man müsste noch zusätzlich darauf reagieren. Andere Frage, ist dein Text ein richtiger Text, d.h. kommen da auch Satzzeichen vor?
    Nein, natürlich muss es nicht unbedingt regex sein. Das war einfach das, was mir als erstes in den Sinn kam....

    Und nein, es kommen nur ganze Zahlen vor und Satzzeichen gibt's auch nicht. Von da her reicht das vollkommen! Danke! Manchmal macht man sich wohl das Leben schwerer als es geigentlich wäre...
     

  10. #10
    Avatar von Yaslaw
    Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    7.046
    Reguläre Ausdrücke gehen in VBA schon. Sind aber sehr umständlich zum handhaben.

    Ein weiteres Problem ist, dass VBA RegExp nicht mit überlappenden Treffer arbeiten kann. Also muss man auch da mit einer Schleife arbeiten.

    Ich habe dir mal ein Beispiel gemacht, wie du die Zahlen findest. Auch wenn sie am String-Anfang oder am String-Ende stehen. Auch Satzzeichen stellen dabei kein Problem dar.
    Code vb:
    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
    
        Dim reg         As New RegExp
        Dim matches     As MatchCollection
        Dim value, i    As Variant
        Dim str         As String
        
        str = "568 test1 tes2t 3test.100 200 test 12"
        
        ' 3teiliger Pattern: 
        ' Ein Nicht-Wort-Zeichen oder String-Anfang: (?:^|[\W])
        ' Eine beliebege Anzahl Nummern: ([\d]+)
        ' Ein Nicht-Wort-Zeichen oder String-Ende: (?:[\W]|$)
        reg.Pattern = "(?:^|[\W])([\d]+)(?:[\W]|$)"
        ' Definieren dass nur ein Treffer genommen wird
        reg.Global = False
        ' Schleife die den String solange parst bis es keine Treffer mehr gibt
        Do While reg.test(str)
            ' String durchsuchen
            Set matches = reg.execute(str)
            ' Treffer extrahieren
            Debug.Print matches.item(0).SubMatches(0)
            ' Die getroffene Stelle durch ein Leerzeichen ersetzen
            str = reg.Replace(str, " ")
        Loop
        
        Set matches = Nothing
        Set reg = Nothing

    Ausgabe
    Code :
    1
    2
    3
    4
    
    568
    100
    200
    12
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements¨in PHP-Code kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit Code-Tags verwenden

  11. #11
    deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.731
    Hi.
    Zitat Zitat von Yaslaw Beitrag anzeigen
    Reguläre Ausdrücke gehen in VBA schon. Sind aber sehr umständlich zum handhaben.

    Ein weiteres Problem ist, dass VBA RegExp nicht mit überlappenden Treffer arbeiten kann. Also muss man auch da mit einer Schleife arbeiten.
    Hierbei ja eigentlich nicht, da sich die Treffer nicht überschneiden.

    Also z.B. einfach:
    Code :
    1
    2
    3
    4
    5
    6
    
    reg.pattern = "\b\d+\b"
    reg.Global = True
     
    For Each Match in reg.Execute("400 test1 tes2t 3test 100 200 test 300")
      Debug.Print Match
    Next
    Ergibt:
    Code :
    1
    2
    3
    4
    
    400
    100
    200
    300
    Gruß
    Yaslaw bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. RegEx erlaubte Eingabe: Zahlen 2 bis 30
    Von RalU im Forum Java Grundlagen
    Antworten: 3
    Letzter Beitrag: 12.03.10, 18:00
  2. JavaScript RegEx für Zahlen
    Von SYS83 im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 31.08.09, 10:57
  3. Regex Problem: Zahlen aus (33:22:11) extrahieren
    Von Nord-Süd-Richtung im Forum PHP
    Antworten: 3
    Letzter Beitrag: 09.01.09, 07:06
  4. Antworten: 5
    Letzter Beitrag: 13.07.07, 13:28
  5. Antworten: 2
    Letzter Beitrag: 22.09.04, 15:55