Java字符串操作 - 子字符串

时间:2016-11-19 21:41:46

标签: java string

我希望能够获取具有此特定形式的String:

  

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

并取出每个短裤并将其内容存储在另一个字符串中,因此输出将类似于S1 =" abc",S2 =" def",S3 =" GHI&#34 ;.问题是在修剪字符串并查找第一个括号以从该位置开始创建子字符串后,我得到一个错误消息,即括号位于 - 1.代码I'使用的是:

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

可能有什么问题,你会建议我怎么做?提前致谢

4 个答案:

答案 0 :(得分:0)

你可以尝试使用StringTokenizer,更容易用它来分割字符串。 你可以

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

这会将R字符串与使用分隔符(;

)分开

答案 1 :(得分: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"]

答案 2 :(得分:0)

如果我了解您的目标,您可以使用正则表达式并编译Pattern以构建List tokens。下面,\\(\\)代表文字字符。然后\\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这样的动态数据结构意味着您的解决方案可以处理更多(或更少)匹配表达式。

答案 3 :(得分: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