我想从字符串中提取特定的子字符串:
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;没有排序。
知道如何解决这个问题吗?
答案 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>part
到replace
处更改
答案 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
}