Java: String aus String erstellen?


25.04.2020, 13:40

Ok, ich habe jezt verstanden wie das geht. Aber wie geht das bei echigen Klammern?

String wort = zeile.replaceAll(".*\\([.*]\\).*", "$1");
// Das funktioniert nicht.

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ich will dich jetzt nicht erschrecken, aber sowas macht man ganz gerne mit Regulären Ausdrücken ("regex"). Sieht kacke aus, tut aber was du willst:

wort = zeile.replaceAll(".*\(([^)]*)\).*", "$1");

Der (in diesem Fall besonders hässliche) Reguläre Ausdruck sucht im Grunde Zeichen zwischen zwei Klammern, und ersetzt dann den ganzen String durch die gefundenen Zeichen.


name123454321 
Beitragsersteller
 25.04.2020, 00:06

Da ich noch neu in Java bin, weiß ich nicht warum dieser Fehler kommt:

Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
ArchEnema  25.04.2020, 00:07
@name123454321

Ach ja, da hab ich das Escaping unterschlagen... Passiert, wenn man es nicht ausprobiert. Versuch mal doppelte Backslashes.

".*\\(([^)]*)\\).*"
name123454321 
Beitragsersteller
 25.04.2020, 00:09
@ArchEnema
The method replaceAll(String, String) in the type String is not applicable for the arguments (String)
name123454321 
Beitragsersteller
 25.04.2020, 13:32
@JonnieDoe

Und wie mache ich es so dass es keine runden Klammern sind sondern eckige?

Und danke für die Hilfe!

JonnieDoe  25.04.2020, 21:05
@name123454321

Das hier sollte für eckige Klammern funktionieren:

String wort = zeile.replaceAll(".*\\[(.*)\\].*", "$1");

Wie schon einige hier erwähnt haben, solltest du dir unbedingt Regular Expressions anschauen. Das ist ein extrem mächtiges Werkzeug zur Mustererkennung in Texten und Filterung von Texten.

Gibt übrigens auch Online-Tools, die das Basteln von Regex vereinfachen.

Du könntest herausfinden an welcher Stelle im String „(" steht, und an welcher Stelle „)" steht (mit der indexOf() - Methode https://www.javatpoint.com/java-string-indexof)

Und dann einen Substring erzeugen, der von der Stelle von „(" bis zur Stelle von „)“geht. (mit der substring() - Methode. https://www.javatpoint.com/substring)

String wort = Zeile.substring(pos1, pos2)

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

Am schnellsten - wenn man sich mit regulären Ausdrücken auskennt - mit den Klassen aus java.util.regex.

Pattern: "\((.*)\)"

Dann Gruppe 1 extrahieren

-----

Ansonsten könntest du eine eigene Methode schreiben, das ist nicht schwer - du suchst nach der öffnenden und der schließenden Klammer und extrahierst den Teil dazwischen mit substring(). Für die Fälle, dass eine der Klammern fehlt oder die Klammern in der falschen Reihenfolge stehen, muss man sich was einfallen lassen, ggf. lässt man einfach die Ausnahmen auslösen, die Java dann von sich aus auslöst.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

MrAmazing2  25.04.2020, 21:13

Dein Regex-Code funktioniert nicht wenn im String ein Newline-Zeichen vorkommt.

Da würde ich \([\S\s]*\) vorschlagen.

Da der String hier "Zeile" heißt, gehe ich aber davon aus, das kein Newline-Zeichen darin vorkommt. Trotzdem wollte ich es anmerken.

PWolff  26.04.2020, 01:22
@MrAmazing2

Man kann einen anständigen regulären Ausdruck auch so konfigurieren, dass er Zeilenumbrüche als normale Zeichen betrachtet.

Matcher m = Pattern.compile("\\((.*)\\)").matcher(zeile);
m.find();
String wort = m.group(1);
Woher ich das weiß:Studium / Ausbildung