Java: String aus String erstellen?
Ich habe in Java einen String namens "Zeile" und der hat denn Wert "hallo (ich)"
Jezt benötige ich einen Befehl der denn String scannt, und im String "Zeile" ein Wort sucht dass zwischen zwei Klammern steht, und dieses Wort dann in denn String "Wort" speichert! Ich hoffe dass ihr mir helfen könnt! Danke im Vorraus!
PS: Das Wort kann auch sonderzeichen wie !, $, % enthalten. Wenn es mit Sonderzeichen nicht geht ist es nicht schlimm aber es währe nett mich zu warnen. :D
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
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.
Ach ja, da hab ich das Escaping unterschlagen... Passiert, wenn man es nicht ausprobiert. Versuch mal doppelte Backslashes.
".*\\(([^)]*)\\).*"
The method replaceAll(String, String) in the type String is not applicable for the arguments (String)
Da hast du das zweite Argument unterschlagen, das muss trotzdem hin: "$1"
Und wie mache ich es so dass es keine runden Klammern sind sondern eckige?
Und danke für die Hilfe!
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)
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.
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.
Edit: Hab die Klammern um's [\S\s]* vergessen ^^
\(([\S\s]*)\) müsste es heißen.
Falls der Fragesteller regex lernen will empfehle ich dieses Video: https://www.youtube.com/watch?v=rhzKDrUiJVk
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);
Da ich noch neu in Java bin, weiß ich nicht warum dieser Fehler kommt: