Hallo Jan,
Die exakte Lösung (schluck):
myRegExp.Pattern =
"(^|[^a-z])[b-z]*a[b-z]*(?=([^a-z]|$))"
*gg* so viel zum Thema Lesbarkeit.
Sollte ich so etwas jemals schreiben können, kann ich das am nächsten Tag schon nicht mehr lesen.
Eine vertretbare Lösung wäre vielleicht:
myRegExp.Pattern = "\b[b-z]*a[b-z]*\b"
Das ist schon etwas kürzer, ich will mal versuchen, das zu verstehen.
„\b“ erkennt Wortgrenzen, also wo eine Zeichenfolge aus
Wortzeichen anfängt und aufhört. Wortzeichen sind aber nicht
nur Buchstaben, sondern auch Ziffern und der Unterstrich „_“.
Eben alles außer Leerzeichen. Das, was ich bekomme, wenn ich mit …
Array = Slpit(Text,Chr(32))
… in VB einen String in einzelne Wörter zerlege.
Der erste Beispiel hat doch aber auch die einzelnen Wörter erkannt, ohne „\b“, einfach nur, weil Du nur nach Zeichen von „a“ bis „z“ hast suchen lassen.
Solange in unserm Beispieltext also keine Ziffern und
Unterstriche vorkommen, sind die beiden Lösungen indentisch.
es mal mit Klammern versucht …
a oder b habe ich hin bekommen:
„[b-z]*a[a-z]*|b[a-z]*“
Nein, das funktioniert nicht.
OK, ich habe mit dem falschen String getestet.
Wörter, die kein a haben und das
b nicht an erster Stelle, werden nicht erkannt bzw. nur ein
Teil. Von „geben“ wird nur „ben“ erkannt.
Stimmt.
Die Lösung ist eigentlich dem Ursprungs-Regexp sehr ähnlich.
myRegExp.Pattern = "[a-z]*[ab][a-z]*"
Der geforderte Buchstabe ist nicht mehr das a, sondern ein
Zeichen aus der Zeichenmenge [ab].
Aha. Und wenn ich nun nach der Zeichenfolge ‚ab‘ suchen will … Mal sehen ob ich das finde.
Den zweiten Teil der Aufgabe, dass der erkannte Buchstabe
ermittelt und angezeigt werden soll, löst man mit den runden
Klammern um das, was man ermitteln will. Ich habe mal auch um
den Teil davor und dahinter runde Klammern gemacht.
…
myRegExp.Pattern = „([a-z]*)([ab])([a-z]*)“
'myRegExp.Pattern = „([a-z]*?)([ab])([a-z]*)“
…
MsgBox ("geforderter Buchstabe: " & myMatch.SubMatches(1) &
Chr(13) & _
"Teil vorm Buchstaben: " & myMatch.SubMatches(0) & Chr(13) &
_
"Teil hinterm Buchstaben: " & myMatch.SubMatches(2))
…
Die auskommentierte Variante des Regexps erkennt exakt die
selben Wörter, aber einen anderen Buchstaben, wenn nicht nur
ein Buchstabe aus der Zeichenmenge [ab] vorkommt.
Ahhh, mit den Runden Klammern bekomme ich die Submatches …
Da tauchen schon wieder die nächsten Probleme auf, die ich aber selbst lösen kann.
Danke für die Erklärung!
Gruß Rainer