String nach Zeichenfolge durchsuchen
Guten Morgen zusammen,
einen String auf eine bestimmte Zeichenfolge zu durchsuchen ist mit hilfe von instr relativ einfach.
Nun möchte ich aber einen Wert finden der zwischen zwei bestimmten Zeichenfolgen steht. Das Problem hierbei ist das zum einen der gesuchte Wert zwischen 1 und 1000000 liegen kann und zum anderen ist die Kombination der Zeichenfolge zwischen dem er steht mehr als einmal im String vorhanden ist.
aus
<P>2628 </P></TD></TR>
soll
2628
werden
ich hoffe jemand von euch kennt da eine unkomplizierten weg mein Problem zu lösen.
einen String auf eine bestimmte Zeichenfolge zu durchsuchen ist mit hilfe von instr relativ einfach.
Nun möchte ich aber einen Wert finden der zwischen zwei bestimmten Zeichenfolgen steht. Das Problem hierbei ist das zum einen der gesuchte Wert zwischen 1 und 1000000 liegen kann und zum anderen ist die Kombination der Zeichenfolge zwischen dem er steht mehr als einmal im String vorhanden ist.
aus
<P>2628 </P></TD></TR>
soll
2628
werden
ich hoffe jemand von euch kennt da eine unkomplizierten weg mein Problem zu lösen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 211484
Url: https://administrator.de/forum/string-nach-zeichenfolge-durchsuchen-211484.html
Ausgedruckt am: 23.12.2024 um 17:12 Uhr
27 Kommentare
Neuester Kommentar
Moin,
musst du in VBA "per Hand" machen, oder dir eine DLL mit RegExp Funktionalität suchen und einbinden.
Per Hand in etwa
1. Per InStr das erste Vorkommen von "<p>" suchen,
2. Ab der Position nach "</p>" suchen
3. Das zwischen den Positionen 1. und 2. ist der gesucht String.
oder als RegExp:
"<p>([0-9]*)</p>"
lg,
Slainte
musst du in VBA "per Hand" machen, oder dir eine DLL mit RegExp Funktionalität suchen und einbinden.
Per Hand in etwa
1. Per InStr das erste Vorkommen von "<p>" suchen,
2. Ab der Position nach "</p>" suchen
3. Das zwischen den Positionen 1. und 2. ist der gesucht String.
oder als RegExp:
"<p>([0-9]*)</p>"
lg,
Slainte
Schau mal hier da sind RegExp anhand von Excel erklärt.
Hallöle Gundelputz,
so z.B.
Dieser Code nimmt den ersten Match der zutrifft in deinem Text.
Möchtest du alle Treffer anzeigen lassen geht das so:
Im Pattern ist berücksichtigt das Leerzeichen vor und hinter der Zahl vorkommen können, weil in deinem Beispiel eins davon hinter der Zahl stand.
Grüße Uwe
so z.B.
strText = "<P>2628 </P></TD></TR>"
Set myRegExp = CreateObject("vbscript.regexp")
myRegExp.IgnoreCase = True
myRegExp.Pattern = "<P>\s*(\d{1,7})\s*<\/p>"
Set myMatches = myRegExp.Execute(strText)
If myMatches.Count >= 1 Then
Set myMatch = myMatches(0)
If myMatch.SubMatches.Count >= 1 Then
strNumber = myMatch.SubMatches(0)
MsgBox strNumber
End If
End If
Möchtest du alle Treffer anzeigen lassen geht das so:
strText = "<P>2628 </P></TD></TR><P> 55845 </P></TD></TR>"
Set myRegExp = CreateObject("vbscript.regexp")
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "<P>\s*(\d{1,7})\s*<\/p>"
Set myMatches = myRegExp.Execute(strText)
If myMatches.Count >= 1 Then
For Each myMatch In myMatches
If myMatch.SubMatches.Count >= 1 Then
strNumber = myMatch.SubMatches(0)
MsgBox strNumber
End If
Next
End If
Im Pattern ist berücksichtigt das Leerzeichen vor und hinter der Zahl vorkommen können, weil in deinem Beispiel eins davon hinter der Zahl stand.
Grüße Uwe
Hallo Gundelputz,
dieses RegEx kann nicht funktionieren.
Und solch ein Tag : <[\r\n]> ohne Tagnamen mit Zeilenumbruch habe ich in HTML auch noch nie gesehen.
Bitte poste mal einen etwas größeren Ausschnitt um die Zahl die du erfassen möchtest, aber bitte mit Tags damit hier keine Sonderzeichen in deinem Text verloren gehen.
Dann bau ich dir ein passendes RegEx dazu ...
Grüße Uwe
dieses RegEx kann nicht funktionieren.
Und solch ein Tag : <[\r\n]> ohne Tagnamen mit Zeilenumbruch habe ich in HTML auch noch nie gesehen.
Bitte poste mal einen etwas größeren Ausschnitt um die Zahl die du erfassen möchtest, aber bitte mit Tags damit hier keine Sonderzeichen in deinem Text verloren gehen.
Dann bau ich dir ein passendes RegEx dazu ...
Grüße Uwe
Für diesen Code
ginge folgender RegEx Ausdruck:
wenn du nur den ersten Treffer von der Seite brauchst, löschst du folgende Zeile im obigen Code oder setzt sie auf
<P style="MARGIN-LEFT: 40px" align=left>Gesamt</P></TD>
<TD>
<P>2628 </P></TD></TR>
<TR>
myRegExp.Pattern = "<P style="MARGIN-LEFT: 40px" align=left>Gesamt<\/P><\/TD>\s*<TD>\s*<P>\s*(\d{1,7})\s*<\/P>"
FALSE
:myRegExp.Global = True
Tach Gundelputz,
guckst du hier:
Grüße Uwe
guckst du hier:
Dim curCell As Range
'Startzelle für den Ausgabebereich
Set curCell = Worksheets(1).Range("A1")
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True
regex.IgnoreCase = True
regex.Pattern = "((Schwarzweiß|Farbe|Gesamt)<\/p><\/td><td><p>\s*(\d+)\s*<\/p>|(Drucken|Fax|Kopie|Gesamt)<\/p><\/td><td><p>(\s*)<\/p><\/td>)"
Set matches = regex.Execute(strText)
If matches.Count <> 0 Then
For Each Match In matches
If Match.Submatches(3) <> "" Then
curCell.Value = Match.Submatches(3)
Else
curCell.Value = Match.Submatches(1)
End If
curCell.Offset(0, 1).Value = Match.Submatches(2)
Set curCell = curCell.Offset(1, 0)
Next
End If
Zitat von @Gundelputz:
bkamm dann Fehlermeldung "Laufzeitfehler" mit verweis auf regex.IgnoreCase = True
kannst du dir da nen Reim drauf machen
klare Diagnose Copy n'paste Syndrom...bkamm dann Fehlermeldung "Laufzeitfehler" mit verweis auf regex.IgnoreCase = True
kannst du dir da nen Reim drauf machen
aus deinem Code hier...
myRegExp.IgnoreCase = True
myRegExp.Global = True
regex.IgnoreCase = True
regex.Pattern = "((Schwarzweiß|Farbe|Gesamt)<\/p><\/td><td><p>\s*(\d+)\s*<\/p>|(Drucken|Fax|Kopie|Gesamt)<\/p><\/td><td><p>(\s*)<\/p><\/td>)"
Set matches = regex.Execute(strText)
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "((Schwarzweiß|Farbe|Gesamt)<\/p><\/td><td><p>\s*(\d+)\s*<\/p>|(Drucken|Fax|Kopie|Gesamt)<\/p><\/td><td><p>(\s*)<\/p><\/td>)"
Set matches = myRegExp.Execute(strText)