it-swarm.com.de

Extrahiere einen String zwischen zwei Strings in java

Ich versuche einen String zwischen <% = und%> zu bekommen. Hier ist meine Implementierung:

String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>";
Pattern pattern = Pattern.compile("<%=(.*?)%>");
String[] result = pattern.split(str);
System.out.println(Arrays.toString(result));

es kehrt zurück

[ZZZZL ,  AFFF ]

Aber meine Erwartung ist:

[ dsn , AFG ]

Wo liege ich falsch und wie kann ich das korrigieren?

34
Tien Nguyen

Dein Muster ist in Ordnung. Aber Sie sollten es nicht split() wegwerfen, Sie sollten es find(). Der folgende Code gibt die Ausgabe an, nach der Sie suchen:

String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>";
Pattern pattern = Pattern.compile("<%=(.*?)%>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}
63
jlordo

Ich habe diese Frage hier beantwortet: https://stackoverflow.com/a/38238785/1773972

Grundsätzlich verwenden

StringUtils.substringBetween(str, "<%=", "%>");

Dies erfordert die Verwendung der Bibliothek "Apache commons lang": https://mvnrepository.com/artifact/org.Apache.commons/commons-lang3/3.4

Diese Bibliothek bietet viele nützliche Methoden für die Arbeit mit Strings. Sie werden wirklich davon profitieren, wenn Sie diese Bibliothek in anderen Bereichen Ihres Java Code !!!

24
Pini Cheyni

Ihr regulärer Ausdruck sieht korrekt aus, aber Sie haben splitting damit statt matching damit. Sie möchten so etwas:

// Untested code
Matcher matcher = Pattern.compile("<%=(.*?)%>").matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group());
}
3
Henry Keiter

Der Jlordo-Ansatz deckt die spezifische Situation ab. Wenn Sie versuchen, eine abstrakte Methode daraus zu erstellen, kann es schwierig sein, zu überprüfen, ob 'textFrom' vor 'textTo' steht. Andernfalls kann die Methode eine Übereinstimmung für ein anderes Vorkommen von 'textFrom' im Text zurückgeben.

Hier ist eine einsatzbereite abstrakte Methode, die diesen Nachteil abdeckt:

  /**
   * Get text between two strings. Passed limiting strings are not 
   * included into result.
   *
   * @param text     Text to search in.
   * @param textFrom Text to start cutting from (exclusive).
   * @param textTo   Text to stop cuutting at (exclusive).
   */
  public static String getBetweenStrings(
    String text,
    String textFrom,
    String textTo) {

    String result = "";

    // Cut the beginning of the text to not occasionally meet a      
    // 'textTo' value in it:
    result =
      text.substring(
        text.indexOf(textFrom) + textFrom.length(),
        text.length());

    // Cut the excessive ending of the text:
    result =
      result.substring(
        0,
        result.indexOf(textTo));

    return result;
  }
2
Zon