从String java中提取子串

时间:2017-03-30 08:46:48

标签: java string apache-stringutils

我想从字符串中提取特定的子字符串:

String source = "info1 info1ContentA info1ContentB info3 info3ContentA info3ContentB"+
"info2 info2ContentA";

结果应为:

String info1 ="info1ContentA info1ContentB";
String info2 ="info2ContentA";
String info3 ="info3ContentA info3ContentB";

对我而言,提取信息非常困难,因为有时候在" info"它们是一个,两个或更多内容信息。发生的另一个问题是,info1,info2等的顺序没有被排序,并且"真实数据"不包含递增的数字。

我的第一个想法是将info1,info2,info3等添加到ArrayList。

private ArrayList<String> arr = new ArrayList<String>();
arr.add("info1");
arr.add("info2");
arr.add("info3");

现在我想用Apache Commons(https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4)中的方法StringUtils.substringBetween()提取子字符串:

String result = StringUtils.substringBetween(source, arr.get(0), arr.get(1));

这是有效的,如果info1在info2之前的字符串中,但就像我说的那样&#34;真实数据&#34;没有排序。

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

按空格拆分这些字符串,然后使用String的方法startsWith将该部分添加到正确的结果字符串

Map<String, String> resultMap = new HashMap<String, String>();
String[] prefixes = new String[]{"info1", "info2", "info3"};    
String source = "info1 info1ContentA info1ContentB info3 info3ContentA info3ContentB"+" info2 info2ContentA";
String[] parts = source.split(" ");

for(String part : parts) {
    for(String prefix : prefixes) {
        if(part.startsWith(prefix) {
            String currentResult = (resultMap.containsKey(prefix) ? resultMap.get(prefix) + part + " " : part);
            resultMap.put(prefix, currentResult);
        }
    }
}

另请考虑使用StringBuilder而不是添加字符串部分

如果您无法确定部件是否包含空格,则可以使用字符串part方法在源字符串中的所有<SPACE>partreplace处更改

答案 1 :(得分:0)

您可以使用正则表达式,如下所示:

String source = "info1 info1ContentA info1ContentB info3 info3ContentA info3ContentB info2 info2ContentA";
for (int i = 1; i < 3; i++) {
    Pattern pattern = Pattern.compile("info" + i + "Content[A-Z]");
    Matcher matcher = pattern.matcher(source);
    List<String> matches = new ArrayList<>();
    while (matcher.find()) {
        matches.add(matcher.group());
    }
    // process the matches list
}