2016-11-19 93 views
0

我希望能夠採取具有此特定形式的字符串:爪哇字符串操作 - 子

R =(ABC)1 +(DEF)J +(GHI)K

,並將其中的內容存儲到另一個字符串中,因此輸出將如S1 =「abc」,S2 =「def」,S3 =「ghi」。問題是,修剪字符串,尋找第一個括號後,以創建從該位置,我得到一個錯誤的信息,即括號是起始於位置的子 - 1.我的代碼已經被使用:

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

什麼可能是錯的,你會如何建議我這樣做?在此先感謝

+2

歡迎堆棧溢出!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然有問題,請隨時返回更多詳情。 –

+0

如果indexOf沒有找到字符串,則返回-1。 –

回答

0

你可以嘗試使用StringTokenizer它更容易拆分字符串。 可以

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

這從使用分隔符(拆分將R串;

0

建議你使用org.apache.commons.lang.StringUtils,具體地該方法substringBetween

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

實施例:

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

如果我明白你是什麼之後,您可以使用的正則表達式並編譯Pattern以構建Listtokens。下面,\\(\\)分別代表字面個字符。然後\\s*匹配(可選)空格。最後,用\\w+將任何連續的字符分組。像,

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

無論你希望將填充tokens

[abc, def, ghi] 

。使用像List這樣的動態數據結構意味着您的解決方案可以處理更多(或更少)的匹配表達式。

0

可以使用正則表達式,Java已通過java.util.regex.Pattern類支持此類。注意:我同時回答了另一個正則表達式的答案。這個答案只涉及匹配括號內任何內容的簡單情況。

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

輸出

abc 
def 
ghi