2016-11-19 7 views
0

Ich möchte einen String zu übernehmen können, die diese spezifische Form hat:Java String Manipulation - Teilzeichenfolge

R = (abc) i + (def) j + (ghi) k

und nehmen Sie jede Panthesis und speichern Sie ihren Inhalt in einem anderen String, so dass die Ausgabe etwa wie S1 = "abc", S2 = "def", S3 = "ghi" wäre. Das Problem ist, dass nach dem String Trimmen und der Suche nach der ersten Klammer einen Teilstring aus, dass ich eine Fehlermeldung Ausgangsposition zu schaffen, dass die Klammer an Position - 1. Der Code, den ich verwendet hat‘ist:

 S1 = equation.substring(equation.indexOf("(")); 

Was könnte falsch sein und wie würden Sie mir vorschlagen, es zu tun? Vielen Dank im Voraus

+2

Willkommen bei Stack-Überlauf! Es sieht so aus, als müssten Sie lernen, einen Debugger zu verwenden. Bitte helfen Sie sich selbst [https://ericlippert.com/2014/03/05/how-to-debug-small-programs/]. Wenn Sie danach noch Probleme haben, können Sie gerne weitere Einzelheiten erfahren. –

+0

'indexOf' gibt -1 zurück, wenn die Zeichenfolge nicht gefunden wurde. –

Antwort

0

Sie könnten versuchen, StringTokenizer verwenden, es einfacher, Strings damit zu teilen. Sie können

StringTokenizer st = new StringTokenizer(R,"("); 
String S1 = st.nextToken(); 
String S2 = st.nextToken(); 
String S3 = st.nextToken(); 

Dies würde die R-String spaltete die delimeter verwenden (;

0

Ich schlage vor, Sie die Verwendung von org.apache.commons.lang.StringUtils, speziell das Verfahren substringBetween

public static String[] substringsBetween(String str, 
             String open, 
             String close) 

Beispiel:

String[] result = StringUtils.substringsBetween("(a)(b)(c)", "(", ")") 
//= ["a","b","c"] 
0

Wenn ich verstehe, was du bist Danach können Sie einen regulären Ausdruck verwenden und einen Pattern kompilieren, um einen List von tokens zu erstellen. Unten stehen \\( und \\) für Literal Zeichen. Dann passt \\s* (optional) Leerzeichen. Schließlich gruppieren Sie alle aufeinanderfolgenden Zeichen mit \\w+. Wie,

String str = "R = (abc) i + (def) j + (ghi) k"; 
Pattern p = Pattern.compile("\\(\\s*(\\w+)\\s*\\)"); 
Matcher m = p.matcher(str); 
List<String> tokens = new ArrayList<>(); 
while (m.find()) { 
    tokens.add(m.group(1)); 
} 

Welche wird bevölkern tokens mit

[abc, def, ghi] 

nach Wunsch. Durch die Verwendung einer dynamischen Datenstruktur wie List kann Ihre Lösung mehr (oder weniger) passende Ausdrücke verarbeiten.

0

Konnte Regex verwenden, Java hat dafür Unterstützung durch java.util.regex.Pattern Klasse. Hinweis: Ich habe zur gleichen Zeit wie eine andere Regex-Antwort geantwortet. Diese Antwort behandelt nur den einfachen Fall, dass irgendetwas zwischen den Klammern übereinstimmt.

String input = "R = (abc) i + (def) j + (ghi) k"; 
Matcher matcher = Pattern.compile("\\((.*?)\\)").matcher(input); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

Ausgabe

abc 
def 
ghi