1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Regex für Zahlen im Text

Dieses Thema im Forum "Office-Anwendungen" wurde erstellt von BaseBallBatBoy, 18. November 2011.

  1. BaseBallBatBoy

    BaseBallBatBoy Erfahrenes Mitglied

    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. BaseBallBatBoy

    BaseBallBatBoy Erfahrenes Mitglied

  3. BaseBallBatBoy

    BaseBallBatBoy Erfahrenes Mitglied

    sorry, das wars ja auch nicht, da kommen 1,2,3 auch mit.... Irgend eine Idee um Alleinstehende Nummern zu finden?
  4. vfl_freak

    vfl_freak Erfahrenes Mitglied

  5. Fabio Hellmann

    Fabio Hellmann Erfahrenes Mitglied

    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.     public List<Integer> extractNumbers(String string) {
    2.         List<Integer> foundValues = new ArrayList<Integer>();
    3.        
    4.         int indexOf = 0;
    5.         while(indexOf != -1) {
    6.             String firstMatch = getFirstMatch(string, " (\\d+) ", indexOf);
    7.             if(firstMatch != null) {
    8.                 // Damit der gleiche String nicht nochmal gefunden wird +1
    9.                 indexOf = string.indexOf(firstMatch)+1;
    10.                 foundValues.add(Integer.valueOf(Integer.parseInt(firstMatch.replaceAll(" ", ""))));
    11.             } else {
    12.                 indexOf = -1;
    13.             }
    14.         }
    15.        
    16.         return foundValues;
    17.     }
    18.  
    19.     private String getFirstMatch(String string, String regex, int start) {
    20.         Pattern pattern = Pattern.compile(regex);
    21.         Matcher m = pattern.matcher(string);
    22.         while(m.find(start)) {
    23.             return m.group(1);
    24.         }
    25.         return null;
    26.     }
    Gruß

    Fabio
    Zuletzt bearbeitet: 18. November 2011
  6. BaseBallBatBoy

    BaseBallBatBoy Erfahrenes Mitglied

    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. Fabio Hellmann

    Fabio Hellmann Erfahrenes Mitglied

    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. ;)
  8. HonniCilest

    HonniCilest Erfahrenes Mitglied

    Muss es unbedingt Regex sein? Wenn nein, anderer Vorschlag:
    Code (Text):
    1. SearchString = "test1 tes2t 3test 100 200 test"
    2.     SearchTokens = Split(SearchString)
    3.      
    4.     For Each SearchToken In SearchTokens
    5.         If IsNumeric(SearchToken) Then
    6.             MsgBox SearchToken
    7.         End If
    8.     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?
  9. BaseBallBatBoy

    BaseBallBatBoy Erfahrenes Mitglied

    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. Yaslaw

    Yaslaw n/a Moderator

    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 (Visual Basic):
    1.     Dim reg         As New RegExp
    2.     Dim matches     As MatchCollection
    3.     Dim value, i    As Variant
    4.     Dim str         As String
    5.    
    6.     str = "568 test1 tes2t 3test.100 200 test 12"
    7.    
    8.     ' 3teiliger Pattern:
    9.    ' Ein Nicht-Wort-Zeichen oder String-Anfang: (?:^|[\W])
    10.    ' Eine beliebege Anzahl Nummern: ([\d]+)
    11.    ' Ein Nicht-Wort-Zeichen oder String-Ende: (?:[\W]|$)
    12.    reg.Pattern = "(?:^|[\W])([\d]+)(?:[\W]|$)"
    13.     ' Definieren dass nur ein Treffer genommen wird
    14.    reg.Global = False
    15.     ' Schleife die den String solange parst bis es keine Treffer mehr gibt
    16.    Do While reg.test(str)
    17.         ' String durchsuchen
    18.        Set matches = reg.execute(str)
    19.         ' Treffer extrahieren
    20.        Debug.Print matches.item(0).SubMatches(0)
    21.         ' Die getroffene Stelle durch ein Leerzeichen ersetzen
    22.        str = reg.Replace(str, " ")
    23.     Loop
    24.    
    25.     Set matches = Nothing
    26.     Set reg = Nothing
    Ausgabe
    Code (Text):
    1. 568
    2. 100
    3. 200
    4. 12
  11. deepthroat

    deepthroat Premium-User

    Hi.
    Hierbei ja eigentlich nicht, da sich die Treffer nicht überschneiden.

    Also z.B. einfach:
    Code (Text):
    1. reg.pattern = "\b\d+\b"
    2. reg.Global = True
    3.  
    4. For Each Match in reg.Execute("400 test1 tes2t 3test 100 200 test 300")
    5.   Debug.Print Match
    6. Next
    Ergibt:
    Code (Text):
    1. 400
    2. 100
    3. 200
    4. 300
    Gruß

Diese Seite empfehlen