获取两个单词之间的字符串

时间:2017-01-11 12:20:44

标签: java arrays string

我想在字符串中获取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

2 个答案:

答案 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