Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Positive und negative Zahlen mit Regex extrahieren
Ziel ist es aus einem String, zum Beispiel: kljgh-4,3lkjg 5,-5sdf
alle positiven und negativen Zahlen (inkl. Minus-Zeichen) herauszufiltern.
Mit oben genanntem Regex und der replace.All([^0-9]+, " ") bekomme ich hervorragend getrennte positive Zahlen aus dem String. Leider bekomme ich den Regex nicht hin, damit auch negative Zahlen der Form -5 (ohne Leerzeichen zwischen Zahl und -) akzeptiert werden.
Dieser Regex matched auf alles außer Zahlen. Dadurch, dass du alles außer die Zahlen durch ein Leerzeichen ersetzt, sieht es dann so aus, als hättest du die Zahlen herausgefiltert.
Eine bessere Variante wäre, einen Regex zu nehmen, der tatsächlich nur die Zahlen akzeptiert, und dann mit einem Matcher über alle Matches zu gehen, z.B. so:
Java:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ZahlenRausfiltern {
public static void main(String[] args) {
Matcher m = Pattern.compile("-?\\d+").matcher("kljgh-4,3lkjg 5,-5sdf");
while (m.find()) {
System.out.println("Zahl: " + m.group() + " an Position: " + m.start() + "-" + m.end());
}
}
}
Ja natürlich, das war mein Fehler, alles außer Zahlen wird ersetzt.
Die Möglichkeit von dir würde ich im Hinterkopf behalten. Gäbe es aber denn keine kompaktere Möglichkeit, angelehnt an die replaceAll-Methode? Vielleicht "matche mir alles außer Zahlen mit eventuellem Minus davor"?
[^-0-9]+
(wobei das auch alleinstehende Minus-Zeichen stehen lässt)
Ich verstehe trotzdem nicht, was genau eigentlich deine Anforderungen sind. Wenn du einfach nur alle Zeichen, die keine Zahlen darstellen, aus einem String entfernst, hast du damit ja noch nicht die Zahlen identifizert (also für einen Computer identifiert, als Mensch "sieht" man die Zahlen in der Ausgabe ja).
[^-0-9]+
(wobei das auch alleinstehende Minus-Zeichen stehen lässt)
Ich verstehe trotzdem nicht, was genau eigentlich deine Anforderungen sind. Wenn du einfach nur alle Zeichen, die keine Zahlen darstellen, aus einem String entfernst, hast du damit ja noch nicht die Zahlen identifizert (also für einen Computer identifiert, als Mensch "sieht" man die Zahlen in der Ausgabe ja).
Ja das grundsätzliche Ziel ist, alle positiven sowie negativen Zahlen aus einem String herauszufiltern. Anschließend soll der String mit .split in ein Array gepackt werden, sodass die Zahlen an jeder einzelnen Position aufgerufen werden können (und in anderen Methoden weiterverarbeitet).
In wie fern meinst du dass, ich hätte damit noch keine Zahlen identifiziert?
Ich meine ob ich jetzt alle Zahlen wirklich herausfilter, oder ob ich alles außer Zahlen lösche kommt doch auf das gleiche heraus oder? Es könnte natürlich sein, dass wenn sich die "Input"-String Struktur ändert dieser Regex mit replaceAll nicht mehr funktioniert und der richtige matcher quasi die "Universallösung" ist, willst du vielleicht darauf hinaus?
Habe es übrigens mit deiner Lösung hinbekommen (obwohl es scheinbar nicht die optimalste Lösung ist). Werde mich aber gerne belehren lassen was besser wäre.
Das alleinstehende Minuszeichen bekomme ich mit -(?![0-9]+).replaceAll with "" heraus.
Ja das grundsätzliche Ziel ist, alle positiven sowie negativen Zahlen aus einem String herauszufiltern. Anschließend soll der String mit .split in ein Array gepackt werden, sodass die Zahlen an jeder einzelnen Position aufgerufen werden können (und in anderen Methoden weiterverarbeitet).
Das Ergebnis ist natürlich dasselbe, ja. Und mir ist es eigentlich egal, welche Lösung du wählst. Ich will damit nur sagen, dass das etwas eine "von hinten durch die Brust ins Auge"-Lösung ist. Wenn du Zahlen suchst, dann nehme einen Regex, der eben Zahlen matched. Zumal dieser auch noch einfacher ist als einer, der alles andere matched.
Und wenn's unbedingt eine Stream-Lösung sein muss:
Java:
public class ZahlenRausfiltern {
public static java.util.stream.Stream<Integer> findIntegers(String s) {
return java.util.stream.Stream
.iterate(java.util.regex.Pattern.compile("-?\\d+").matcher(s), i -> i)
.takeWhile(java.util.regex.Matcher::find) // <- Java 9+!
.map(java.util.regex.Matcher::group)
.map(Integer::valueOf);
}
public static void main(String[] args) {
findIntegers("kljgh-4,333lkj-g 5,-5sdf").forEach(System.out::println);
}
}
(Javas Matcher bietet leider keinen Stream über die Matches)