Und damit hast Du hier schon deutlich mehr in die Aufgabe hinein interpretiert, als gegeben.
Der TE schien mit seinem Algorithmus / regulären Ausdruck ja schon soweit zufrieden. Es störte ihn nur eine Sache:
Damit weiß ich lediglich, das eine 3-stellige-Zahl im String vorhanden ist, ich benötige aber auch die Position im String.
Daher kann man auf diesem regulären Ausdruck ja weiter aufsetzen, wie es getan wurde. Wenn man sich damit nicht weiter auseinander setzen möchte, dann könnte man die Zahl in eine Group setzen und auslesen - dann wäre auch ein String.indexOf denkbar als mögliche Lösung (So man nicht zu viel mit regulären Ausdrücken machen möchte.)
Bezüglich der "validen 3-stelligen Zahlen": Dies kann sehr vieles sein:
- Auf Grund des Beispiels könnte man annehmen, dass da Whitespaces zur Abgrenzung vorhanden sind.
- Es könnte aber auch einfach sein, dass der String das Format hat XXXXXzzzXXXXXX mit jeweils beliebigen Mengen X, jedes einzelne X ist ein beliebiges Zeichen (incl. Ziffern!) und es werden alle möglichen zzz mit jedem z eine Ziffer gesucht. Dann würde bei aaa1234aa sowohl die 123 als auch die 234 gesucht werden - unabhängig davon dass 1234 eben eine vierstellige Zahl wäre.
- Selbst wenn man valide 3-stellige Zahlen sucht, dann wäre 0123 ggf. keine valide 3 stellige Zahl, da es eben 4-Stellig ist. Wenn man die 0er nicht zählt, dann wäre 012 übrigens auch keine valide 3-stellige Zahl, da diese nach den angegebenen Regeln nur einer 12 entsprechen würde.
Hintergrund ist halt, dass wir nicht wissen, was da in dem String ist. Hier ist also nicht vom rein mathematischen Ansatz auszugehen, das nur eine Zahl an sich betrachtet, die für sich klar begrenzt ist sondern hier gehen wir von einer beliebigen Zeichenkette aus und es ist eben nicht gesagt, die diese Grenzen aussehen und was man da alles begrenzen muss. Daher ist 1234 keine 3-stellige Zahl. Der String "1234" enthält aber durchaus 2 3-stellige Zahlen: 123 und 234.
Valide 3-stellige Zahlen via Regex zu ermitteln, ist nicht so einfach.
Wenn man die Regeln kennt, dann kann man das durchaus als RegeEx darstellen. Dann muss vor der Zahl der Anfang des Strings sein oder beliebige Zeichen, die keine Ziffern sind. Dann dürften beliebige Anzahl 0er folgen. Dann kämen die 3 Ziffern und danach entweder keine Ziffer oder das Ende des Strings. (Das dürfte ungefähr dem entsprechen, das Du gemacht hast)
Ansonsten sollte man bei so Codes immer darauf achten, dass dieser lesbar ist. Eine Methode mit mehreren verschachtelten Schleifen und einigen if und if/else würde ich nicht darunter verstehe. Hier wäre ein Refactoring also dringend notwendig so man verständlichen Code haben möchte.
Ansonsten gibt es einen ganz einfachen Ansatz ohne Reguläre Ausdrücke der das Problem in einfache Teilprobleme unterteilt:
a) Ich splitte den String so auf, dass ich nur Zeichenketten mit Ziffern habe (ein split("[^0-9]") könnte das schon machen)
b) jetzt könnte man beliebige Prüfungen anwenden, die man für richtig erachtet und die Werte beliebig auswerten. (führende 0er könnte man weglassen so es mehr als 3 Stellen sind, lange Ziffern könnte man in die 3er Substrings aufteilen, u.s.w.) Wir kennen halt die Regeln nicht aber wir haben die Bedingung recht schön eigenständig gemacht.
c) Am Ende hat man die Zielmenge der Teilstrings und kann dann die Stellen, an denen diese sich befinden, ermitteln (Mehrmaliger Aufruf von String.indexOf).
Das einfach einmal zu meiner Sicht auf diese Aufgabenstellung.