Regex für Zahlen im Text

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
 
Hi,
also ich habe da selber erst einmal ein wenig rumtüfteln müssen. Bin nun aber auf eine Lösung gekommen. :)
Java:
	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
 
Zuletzt bearbeitet:
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
 
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. ;)
 
Muss es unbedingt Regex sein? Wenn nein, anderer Vorschlag:
Code:
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?
 
Muss es unbedingt Regex sein? Wenn nein, anderer Vorschlag:
Code:
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...
 
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.
Visual Basic:
    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:
568
100
200
12
 
Zurück