Positive und negative Zahlen mit Regex extrahieren

Diskutiere Positive und negative Zahlen mit Regex extrahieren im Java Basics - Anfänger-Themen Bereich.
Bitte aktiviere JavaScript!
C

Caliburns

Hallo zusammen,

ich habe folgenden Regex vorliegen: [^0-9]+

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.

Für eure Hilfe schon einmal Vielen Dank!

Viele Grüße
 
H

httpdigest

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());
    }
  }
}
 
C

Caliburns

Vielen Dank für die Antwort!

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"?

Vielen Dank!
 
H

httpdigest

[^-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).
 
A

abc66

Java:
String s = "kljgh-4,333lkj-g 5,-5sdf";
s = s.replaceAll(".*?(-?[0-9]+)[^-0-9]*", "$1 ");
System.out.println(s);
 
C

Caliburns

[^-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.

Viele Grüße und Danke
 
Zuletzt bearbeitet:
A

abc66

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).
Gute Idee :)
Java:
		Arrays.stream("kljgh-4,333lkj-g 5,-5sdf".replaceAll(".*?(-?[0-9]+)[^-0-9]*", "$1 ").split(" "))
				.map(Integer::parseInt).collect(Collectors.toList()).forEach(System.out::println);
 
H

httpdigest

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?
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)
 
Thema: 

Positive und negative Zahlen mit Regex extrahieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben