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

Java 获取两个单词之间的字符串,java,arrays,string,Java,Arrays,String,我想得到字符串中两个单词之间的字符串。像这样: String s = "Play A ROCK song" 所以我想得到:A和歌曲之间的字符串,在这个例子中是摇滚乐 我试过这个: public static String subStringBetween(String text, String after, String before) { String p1 = getWordsAfter(text, after); String p2 = getWordsBefor

我想得到字符串中两个单词之间的字符串。像这样:

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];
}
public静态字符串subStringBetween(字符串文本、字符串后、字符串前){
字符串p1=getWordsAfter(文本,后面);
字符串p2=getWordsBefore(文本,before);
Set aSet=newhashset(Arrays.asList(p1.split(“”));
Set bSet=newhashset(Arrays.asList(p2.split(“”));
设置结果=新哈希集(aSet);
结果:保留(bSet);
字符串=”;
for(字符串s:结果){
如果(字符串==“”){
字符串=s;
}否则{
字符串+=“”+s;
}
}
返回字符串;
}
公共静态字符串getWordsAfter(字符串文本、字符串字){
字符串[]splt=text.split(word);
返回splt[1];
}
公共静态字符串getWordsBefore(字符串文本、字符串单词){
字符串[]splt=text.split(word);
返回splt[0];
}
它是有效的,但是如果一首歌和一首歌之间的字符串不止一个单词,它是有效的,但是打印出一些奇怪的东西,比如:播放一首好的摇滚歌曲
返回的是Rock-Nice,而不是Nice-Rock这是一种非常新颖的方法,因此我尊重这一点,不建议使用正则表达式(尽管这是更直接的方法)

在这种情况下,您遇到了一个问题:哈希集不能保证以任何特定的顺序出现,而且由于您以特定的顺序对它们进行迭代,谁知道这些字符串将以什么顺序出现呢

解决方法其实很简单。改用这个类。这保证了保持插入顺序

对正在使用的所有集合执行此操作

Set<String> aSet = new LinkedHashSet<>(Arrays.asList(p1.split(" ")));
Set<String> bSet = new LinkedHashSet<>(Arrays.asList(p2.split(" ")));

Set<String> result = new LinkedHashSet<>(aSet);
Set aSet=newlinkedhashset(Arrays.asList(p1.split(“”));
Set bSet=newlinkedhashset(Arrays.asList(p2.split(“”));
设置结果=新LinkedHashSet(aSet);

然后,调用方法时的顺序将与您期望的顺序相同。

您也可以尝试短一点的代码:

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
public静态字符串subStringBetween(字符串文本、字符串后、字符串前){

Pattern=Pattern.compile(“(?尝试用正则表达式解析它您可以使用
split()
方法并进行一些搜索。你可以看看这个线程,它应该会对你有所帮助:我发布了我尝试过的内容:p这给出了一个空字符串:/@Liwaa:在每个示例中,我都运行了它,性能很好。如果没有特定的输入,就不可能告诉你是什么原因造成的。输入:播放摇滚歌曲输出:播放音乐Song@Liwaa当前位置可能存在的问题是大小写之一。在
getWordsAfter
getWordsBefore
方法中,您不考虑空格;也就是说,您没有将
word
视为实际的“单词”“。这有点棘手,但它涉及到你决定如何对待
单词
——你是否将其视为一个有保证的空格的单词?它在混合大小写设置下运行良好,这就是我得出这个结论的原因。输入:播放摇滚歌曲输出:播放Y摇滚歌曲