2017-01-11 2 views
1

Ich möchte die Zeichenfolge zwischen 2 Wörtern in einer Zeichenfolge abrufen. wie folgt:Eine Zeichenfolge zwischen 2 Wörtern erhalten

String s = "Play A ROCK song" 

Also ich möchte die Zeichenfolge zwischen: A und Song, die in diesem Fall ist Rock.

Ich versuchte dies:

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]; 
} 

Es funktioniert, aber wenn die Zeichenfolge zwischen A und Song mehr als ein Wort, es funktioniert, aber druckt etwas seltsam, wie wenn es war: Jetzt Nizza Rocksong die Rückkehr wäre Rock Nice, nicht Nice Rock

+1

Versuchen Sie es mit einem regulären Ausdruck zu lösen –

+0

können Sie 'split()' Methode verwenden und eine Suche. –

+0

können Sie einen Blick auf diesen Thread werfen, der Ihnen helfen sollte: http://StackOverflow.com/Questions/16597303/extract-string-between-two-strings-in-java – Rouliboy

Antwort

1

Sie können auch ein wenig kürzer Code versuchen:

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 
+0

Eingabe: ein Rocklied spielen Ausgabe: Einen Y A ROCK Song – Liwaa

+0

Ich bearbeitete von Antwort. Sollte jetzt in Ordnung sein – Uata

2

Dies ist eine sehr neue Art und Weise, dies zu tun, so werde ich das respektieren und nicht vorschlagen, reguläre Ausdrücke (obwohl das wäre der einfachere Ansatz).

In diesem Zusammenhang Sie in ein Problem ausgeführt haben: Hash-Sets sind nicht in einer bestimmten Reihenfolge sein garantiert, und da Sie über sie in einer bestimmten Reihenfolge sind Iterieren, wer weiß welcher Reihenfolge diejenigen Saiten werden kommen?

Die Lösung ist eigentlich sehr einfach. Verwenden Sie stattdessen die Klasse LinkedHashSet. Dies gewährleistet die Beibehaltung der Reihenfolge.

Tun Sie dies für alle Sätze, die Sie verwenden.

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

Set<String> result = new LinkedHashSet<>(aSet); 

Dann ist die Reihenfolge, was Sie erwarten, wenn Sie Ihre Methode aufrufen.

+0

dies gab eine leere Zeichenfolge:/ – Liwaa

+0

@Liwaa: In jedem Beispiel lief ich es gut durchgeführt. Ohne spezifische Eingaben ist es unmöglich, Ihnen zu sagen, was das verursacht hat. – Makoto

+0

Eingabe: ein Rock-Lied spielen Ausgabe: Spielen eines Songs – Liwaa

Verwandte Themen