我想在字符串中获取2个单词之间的字符串。像这样:
String s = "Play A ROCK song"
所以我想得到A和歌之间的字符串,在这种情况下是摇滚。
我试过了:
public static String subStringBetween(String text, String after, String before) {
String p1 = getWordsAfter(text, after);
String p2 = getWordsBefore(text, before);
Set<String> aSet = new HashSet<>(Arrays.asList(p1.split(" ")));
Set<String> bSet = new HashSet<>(Arrays.asList(p2.split(" ")));
Set<String> result = new HashSet<>(aSet);
result.retainAll( bSet);
String string = "";
for (String s : result) {
if (string == "") {
string = s;
}else{
string +=" " + s;
}
}
return string;
}
public static String getWordsAfter(String text, String word) {
String[] splt = text.split(word);
return splt[1];
}
public static String getWordsBefore(String text, String word) {
String[] splt = text.split(word);
return splt[0];
}
它有效,但是如果A和Song之间的字符串不止一个字,它就可以工作,但会打印一些奇怪的东西,比如它是:播放一首好听的摇滚歌曲 回归将是Rock Nice,而不是Nice Rock
答案 0 :(得分:2)
这是一种非常新颖的方式,所以我会尊重这一点,而不是建议使用正则表达式(虽然这将是更简单的方法)。
在这种情况下,您遇到了一个问题:哈希集不保证按任何特定顺序排列,并且由于您按特定顺序迭代它们,谁知道这些字符串会以什么顺序进来?
修复实际上非常简单。请改用LinkedHashSet
类。这可以保证保留插入顺序。
对您正在使用的所有套装执行此操作。
Set<String> aSet = new LinkedHashSet<>(Arrays.asList(p1.split(" ")));
Set<String> bSet = new LinkedHashSet<>(Arrays.asList(p2.split(" ")));
Set<String> result = new LinkedHashSet<>(aSet);
然后,订单将是您调用方法时的预期。
答案 1 :(得分:1)
您还可以尝试更短的代码:
public static String subStringBetween(String text, String after, String before) {
Pattern pattern = Pattern.compile("(?<=\\s|^)"+after +"\\s(.*?)\\s+"+ before);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
return matcher.group(1);
}
return ""; //or null or whatever you need
}
Input: Play a Nice Rock Song
After: a
Before: Song
Output: Nice Rock
Input: play a rock song xxx
After: a
Before: song
Output: rock
Input: a Play Nice Rock Song
After: a
Before: Song
Output: Play Nice Rock
Input: aaaa bbbb a bbb aaa b aaaa bbb
After: a
Before: b
Output: bbb aaa