0

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

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

结果应该是:

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

对我来说,提取信息非常困难,因为有时在“信息”之后它们是一个、两个或多个内容信息。发生的另一个问题是,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 之前的字符串中,但就像我说的那样,“真实数据”没有排序。

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

4

2 回答 2

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而不是添加字符串部分


如果您不能确定部分是否包含空格,您可以使用 String方法在源字符串的开头全部part更改为<SPACE>partreplace

于 2017-03-30T08:50:30.183 回答
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
}
于 2017-03-30T08:57:35.410 回答